2013-03-06 38 views
2

我正在使用Visual Studio 2010,以及Windows 7,.net4上的Votive插件和最新的WiX 3.7來創建msi。爲什麼我的WiX自定義操作拋出System.IO.FileNotFoundException?

安裝相當複雜,在我的電腦上測試時工作正常。

在安裝過程中,我運行了一些自定義操作。 其中一個自定義操作需要一個外部SQLite dll來進行數據庫訪問,這只是自定義操作需要的。

當我在沒有我的開發環境的電腦上運行它時,只是簡單的Windows 7,我得到一個文件未找到錯誤。這似乎很明顯是因爲SQLite尚未安裝在這臺電腦上。

我得到的錯誤是:

System.IO.FileNotFoundException:未能加載文件或程序集「System.Data.SQLite.dll」或它的一個依賴。指定的模塊無法找到。

我可以從詳細日誌中看到自定義操作正在本地提取到臨時文件以運行。這是從日誌文件的摘錄:

(SERVER)  MSI (s) (74:C0) [09:08:07:527]: Executing op: ActionStart(Name=InitializeDbDeferred,,) 
(UNKNOWN) Action 09:08:07: InitializeDbDeferred. 
(SERVER)  MSI (s) (74:C0) [09:08:07:528]: Executing op: CustomActionSchedule(Action=InitializeDbDeferred,ActionType=1025,Source=BinaryData,Target=InsertDefaultRepositoryDeferred,CustomActionData=DATA=C:\AXS Standalone NVR;REPOSITORYPATH=C:\AXS Repository - (Available Space: 364 (Gb));QUOTA=25) 
(SERVER)  MSI (s) (74:88) [09:08:07:530]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI4252.tmp, Entrypoint: InsertDefaultRepositoryDeferred 
(UNKNOWN)  SFXCA: Extracting custom action to temporary directory: C:\Users\Admin\AppData\Local\Temp\MSI4252.tmp-\ 
(UNKNOWN)  SFXCA: Binding to CLR version v4.0.30319 
(UNKNOWN)  Calling custom action CustomAction!CustomAction.CustomAction.InsertDefaultRepositoryDeferred 
(UNKNOWN)  Exception thrown by custom action: 
(UNKNOWN)  System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. The specified module could not be found. 
(UNKNOWN)  at CustomAction.CustomAction.InsertDefaultRepositoryDeferred(Session session) 
(UNKNOWN)  --- End of inner exception stack trace --- 

我的問題是,我該如何讓自定義操作過程中「看見」的SQLite DLL中當CA正在從一個臨時位置運行安裝?我是否需要'將CA包裝在一起,並以某種方式將它們集合在一起。

我試過在安裝程序中包含SQLite dll文件,但是臨時位置的CA不知道它在哪裏。

我只是看不到如何讓CA找到SQLite DLL。

回答

3

無法加載文件或程序集「System.Data.SQLite.dll」 或其 的一個依賴

DTF自動使所有項目內容,以及組裝引用並將它們壓縮成最終的本地DLL。您應該在自定義操作的生命週期內在臨時目錄中看到SQLLite程序集。

您會注意到錯誤消息顯示「或其某個依賴關係」。我會看看使用ILDASM或.NET Reflector的DLL,並查看該DLL的引用是什麼。然後將它們作爲項目(內容副本)或引用添加到您的DTF項目中。目標是將它們打包到最終的DLL中並將其放到臨時目錄中。

+0

我剛剛打開它在dotPeek和程序集需要System.Data和System.Transactions。另一種方法是創建一個空的類庫,添加SQLite.dll,然後看看它還需要什麼。 – 2013-03-06 13:37:24

+1

我離開這個答案,因爲它仍然可能需要,但我已經創建了另一個答案,這是第一個嘗試。 – 2013-03-06 13:52:02

+0

我認爲這是正確的答案,因爲它導致我的問題。測試人員試圖使用'N'版本的窗口,我甚至不知道它存在。該版本還有**很多**更新優秀。 SQLite dll上的Dependency Walker顯示下面的dll丟失; 'MSVCR100.dll,MF.dll,MFPLat.dll,MFReadWrite.dll'。一旦我讓他們應用所有未完成的更新,安裝程序就會運行。無論哪個(現在)罪犯現在都被修復了。故事的道德,如果某些東西不起作用,不要自動假設你*做的是錯的! – Hari 2013-03-07 10:25:54

3

我要離開我的其他答案,因爲它是其他場景的有用信息,但我認爲今天的問題更簡單。

當您使用Votive添加對DTF C#自定義操作項目的引用時,如果程序集名稱以單詞「System」開頭,它會自動設置CopyLocal = False。這是爲了避免打包通常在.NET Framework中找到的DLL。但是,微軟已經習慣於將「系統」程序集與其他可再分發程序一起運送。

因此,請嘗試將CopyLocal更改爲True,以查看該參考是否變得更好。 Ralph提到的System.Data和System.Transactions附帶在框架中。

+0

嗨,我已經設置複製本地標誌爲所有的dll的我在自定義操作引用,我可以看到這增加了CA DLL的大小,所以我想他們正在被包括在內。但是,當我嘗試安裝時,仍然出現相同的錯誤。找不到SQLite.dll或依賴項。 – Hari 2013-03-06 14:31:35

+0

我可以提出一個建議,如添加System.Data和System.Transactions並設置CopyLocal = true,但這只是猜測。你只需要挖掘並分析它。 – 2013-03-06 14:33:51

+0

@ChristopherPainter - 你會用什麼工具來分析它? – 2016-03-02 00:33:59

相關問題