2013-03-14 103 views
16

我試圖調試我的自定義操作。 我把Debugger.Break()放入自定義動作cs中。 當我建立自定義操作它創建了一個文件:WIX自定義操作調試不起作用

myCustomAction.dll 
myCustomAction.CA.dll 
myCustomAction.pdb 

在WiX的項目中,我引用的二進制代碼(不myCustomAction.dll)內myCustomAction.CA.dll。 由於不存在myCustomAction.CA.pdb,這是調試不起作用的原因嗎? 我也嘗試過使用messagebox,並在顯示消息框時附加到進程。 但我收到以下消息:無法找到或打開PDB文件。

我在做什麼錯了?我有wix 3.5版本和visual studio 2010.

+0

你看到了嗎? http://stackoverflow.com/questions/2566977/no-debug-info-in-wix-managed-custom-action-using-visual-studio-integration – 2013-03-14 09:04:55

+0

我創建了類型C#自定義操作項目的項目。 有其他設置嗎? – Simon 2013-03-14 10:24:35

回答

3

隨着DTF自定義操作,這兩種技術是:

1)把一個消息在您的自定義操作,然後附加的Visual Studio這一進程。附加時,請查找帶本機和CLR加載的rundll32進程。

2)將MsiBreak環境變量設置爲入口點的名稱並重啓機器。該自定義操作被調用時,DTF將調用調試器。

否則,我的一般建議是讓您的入口點是一個非常薄的單板,將可重用類連接到MSI。我通常會創建一個獨立的類,我可以提供數據並在控制檯應用程序中測試所有內容,然後將該類連接到DTF。我幾乎從不需要調試安裝程序自定義操作。

否則我一般知道這個作品。

+0

如果自定義操作是我創建的合併模塊的一部分,您知道MMSIBREAK環境變量是否工作嗎? – 2015-12-10 18:56:12

+0

我記憶猶新,不能回想起完整的解決方案。以下是一些亮點:我不記得MMSIBREAK是否在DLL中使用CustomAction名稱或Entrypoint名稱。如果自定義操作名稱與合併模塊的唯一區別是名稱是模塊化的(Name.GUID而不是名稱)。如果入口點名稱,沒有區別,因爲沒有模塊化。 – 2015-12-10 19:04:05

+0

另一個考慮因素是,如果自定義操作在延遲執行中運行,並且沒有在系統上下文中運行,則必須在重新啓動計算機才能獲取MSI所看到的環境變量。這是Windows中的服務控制管理器行爲。 – 2015-12-10 19:05:22

43

這是the article幫助我。

只是將下面的代碼添加到您的自定義操作的第一行:

System.Diagnostics.Debugger.Launch(); 

然後,只需運行安裝程序。當它開始執行您的操作時,彈出窗口將顯示提議啓動visual studio進行調試。

您的參考庫是正確的,它必須是* .CA.dll。此外,使用MessageBox的方法也可以,但您需要附加到rundll32進程。

+2

這應該被標記爲正確的答案。 – 2014-01-17 14:45:59

+1

值得注意的是,按照[文檔](http://msdn.microsoft.com/en-us/library/aa368322%28VS.85%29.aspx),'MsiProcessMessage'(session.Log後面的API)不能從ControlEvent使用。這會阻止你的日誌顯示在日誌中 - 這讓我撓了一陣頭腦! – 2014-02-25 10:18:29

+0

正是我期待的!謝謝! – 2014-07-22 13:03:53

0

這是除了利用

System.Diagnostics.Debugger.Launch(); 

在改善遠程系統上的調試,像VM的一種方式。 我在用於打包.CA.dll的wix​​目標文件中做了一些更改,並且我有很好的結果。

在我添加的支票 %(ReferenceCopyLocalPaths.extension)「==」第一個創建項目的條件.PDB」 這樣我最依賴的.pdb現在包括即時通訊我.CA.dll和在遠程系統上提供更簡單的調試體驗。

C:\ Program Files(x86)\ MSBuild \ Microsoft \ WiX \ v3.x \ wix.ca。目標

<Target Name="PackCustomAction" 
    Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)" 
    Outputs="$(IntermediateOutputPath)$(TargetCAFileName)"> 

    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. --> 
    <CreateItem 
    Include="@(ReferenceCopyLocalPaths)" 
    Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.pdb' or '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe'"> 
     <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/> 
    </CreateItem>