我正在使用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。
我剛剛打開它在dotPeek和程序集需要System.Data和System.Transactions。另一種方法是創建一個空的類庫,添加SQLite.dll,然後看看它還需要什麼。 – 2013-03-06 13:37:24
我離開這個答案,因爲它仍然可能需要,但我已經創建了另一個答案,這是第一個嘗試。 – 2013-03-06 13:52:02
我認爲這是正確的答案,因爲它導致我的問題。測試人員試圖使用'N'版本的窗口,我甚至不知道它存在。該版本還有**很多**更新優秀。 SQLite dll上的Dependency Walker顯示下面的dll丟失; 'MSVCR100.dll,MF.dll,MFPLat.dll,MFReadWrite.dll'。一旦我讓他們應用所有未完成的更新,安裝程序就會運行。無論哪個(現在)罪犯現在都被修復了。故事的道德,如果某些東西不起作用,不要自動假設你*做的是錯的! – Hari 2013-03-07 10:25:54