我正在使用 Visual Studio 2010、Windows 7 上的 Votive 插件、.net4 和最新的 WiX 3.7 来创建 msi。
安装非常复杂,当我在我的电脑上测试它时工作正常。
在安装过程中,我运行了一些自定义操作。其中一个自定义操作需要一个外部 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 ---
我的问题是,当 CA 从临时位置运行时,如何让自定义操作在安装期间“查看”SQLite dll?我是否必须以某种方式将 CA 和它的 dll 打包在一起。
我尝试将 SQLite dll 作为文件包含在安装程序中,但临时位置中的 CA 不会“知道”它在哪里。
我只是看不到如何让 CA 找到 SQLite dll。