2014-01-31 49 views
0

我有一個InstallShield安裝程序,它在安裝過程中調用一個C++/CLI DLL Me.dll,它又調用一個C#程序集; Microsoft.Foo.dllInstallShield和工作目錄

當InstallShield安裝程序嘗試加載Microsoft.Foo.dll時,我得到一個FileNotFoundException(即無法加載程序集)。

使用fuslogvw.exe它告訴我程序集試圖從桌面加載,這是我運行安裝程序的地方。奇怪的部分是,在安裝程序中調用ChangeDirectory,然後驗證SUPPORTDIR(即提取文件的temp)是否確實是當前目錄。我也在所有的程序集上嘗試了UseDLL,但這也不起作用。

如果在安裝期間手動將程序集複製到桌面,安裝程序將工作。

我必須缺少一個步驟。我如何將InstallShields當前工作目錄更改爲SUPPORTDIR,以便它可以正確地找到此程序集?

+0

如果安裝程序調用dll,則它需要與安裝程序位於同一文件夾中。更改目錄與​​此問題無關。您似乎在安裝程序dll和已安裝的dll之間存在某種混淆。是在安裝的應用程序中使用的Microsoft.foo.dll嗎? –

+0

是的,它也用於已安裝的應用程序中。更具體地說,我稱UseDLL(SUPPORTDIR ^「Me.dll」);然後調用該DLL中的函數。 Me.dll是什麼引用Microsoft.Foo.dll。 – BigHands79

+1

需要在兩個地方,除非你要嘗試使用appdomain.assembly解決。 http://msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx –

回答

0

我之前玩過這麼多的耳朵(博客:Managed Code CAN Access the MSIHANDLE)。所有這些都被Windows Installer XML(WiX)部署工具基礎(DTF)所淘汰。閱讀Deployment Tools Foundation (DTF) Managed Custom Actions作爲引物。

基本上DTF構建了自定義動作DLL,它們作爲標準的C/C++自定義動作出現在Windows Installer中。他們處理調用你的C#代碼,使其不會將CLR版本紋理化爲MSIEXEC,並使當前目錄中的所有依賴項都可用,並將所有的MSI API調用編組爲一個Session類。它確實是這裏描述的黃金標準:Reasons DTF is Better