2010-07-22 91 views
3

action1如何從C#自定義操作中設置MSI屬性,到目前爲止我有這個但是如何獲取句柄?來自C#自定義操作的MsiSetProperty

[DllImport("msi.dll", CharSet = CharSet.Unicode)] 
static extern int MsiSetProperty(IntPtr hInstall, string szName, string szValue); 

public void SetProperty(string propertyName, string propertyValue) 
{ 
    MsiSetProperty(handle, propertyName, propertyValue); 
} 

我打電話從維克斯的CA與下面的行

<CustomAction Id="CA1" BinaryKey="ca1.dll" DllEntry="action1" /> 

和動作1看起來像這樣

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult action1(Session session) 
    { 
     session.Log("Begin action1"); 
     SetProperty("xyz", "123"); 
    } 
} 
+0

您是否在使用WiX模板創建C#自定義動作庫? – fletcher 2010-07-22 09:46:11

+0

是的,我是。 (不能發佈少於15個字符,這是可以的。) – 2010-07-22 10:10:49

+0

你可以發佈你從WiX呼叫的功能嗎?那些具有[CustomAction]屬性。我只是試圖確保你正在編寫自定義操作的方式,我認爲你是...這些函數應該有以下簽名:public static ActionResult (Session session) – fletcher 2010-07-22 10:56:17

回答

4

您應該能夠通過執行設置屬性如下:

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult action1(Session session) 
    { 
     string xyzProperty = "XYZ"; 

     session[xyzProperty] = "ABC"; 
    } 
} 

參見克里斯托弗畫家的帖子在這裏:

http://blog.deploymentengineering.com/2008/05/deployment-tools-foundation-dtf-custom.html

我敢肯定,他會很快就一起在這一個發表評論。

+1

現在我覺得一個問題巨魔。 在DTF中,我們無法訪問句柄,因爲從技術上講,我們正在運行MSI以外的流程。會話對象是我們通過IPC返回非託管dll的代理,它處理我們所有的P/Invoke互操作。另一個提示,句柄仍然存在,儘管如此請確保通過將對象(例如數據庫視圖和記錄)放入Using()塊內,來充分利用DTF中的各種IDispose實現。當對象超出範圍時,它會調用Dispose(),這將導致非託管端關閉各種MSI句柄。 – 2010-07-22 12:57:53

+0

由於您已經完成了C++類型1的CA,所以您無疑會意識到MSI在關閉句柄失敗時可以做的時髦事情。 – 2010-07-22 12:59:35

+0

您的意見非常豐富,我從這個網站了解到很多關於WiX的信息......我們近乎拍攝了InstallShield! – fletcher 2010-07-22 13:08:33