2

我正在使用 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。

4

2 回答 2

3

无法加载文件或程序集“System.Data.SQLite.dll”或其依赖项之一

DTF 自动获取所有项目内容和程序集引用并将它们压缩到最终的本机 DLL 中。在自定义操作的生命周期内,您应该会在 temp 目录中看到 SQLLite 程序集。

您会注意到错误消息显示“或其依赖项之一”。我会使用 ILDASM 或 .NET Reflector 查看 DLL 并查看该 DLL 的引用是什么。然后将它们作为项目(内容副本)或引用添加到您的 DTF 项目中。目标是让它们被打包到最终的 DLL 中并放到临时目录中。

于 2013-03-06T13:15:12.537 回答
3

我留下我的另一个答案,因为它对其他场景很有用,但我认为今天的问题更简单。

当您使用 Votive 添加对 DTF C# 自定义操作项目的引用时,如果程序集名称以单词“System.”开头,它会自动设置 CopyLocal=False。这是为了避免打包 .NET Framework 中常见的 DLL。然而,微软已经养成了将“系统”程序集与其他可再发行产品一起运送的习惯。

因此,请尝试将该参考的 CopyLocal 更改为 True,看看它是否会变得更好。Ralph 提到的 System.Data 和 System.Transactions 随框架一起提供。

于 2013-03-06T13:51:34.867 回答