为什么我的WiX Custom操作会抛出System.IO.FileNotFoundException?

时间:2013-03-06 11:23:47

标签: c# wix windows-installer

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:3)

我离开了我的其他答案,因为它对其他方案有用,但我认为今天的问题更简单。

使用Votive添加对DTF C#自定义操作项目的引用时,如果程序集名称以单词" System。"开头,则会自动设置CopyLocal = False。这是为了避免打包通常在.NET Framework中找到的DLL。但是,微软已经养成了运输和#34; System"具有其他可再发行组件的程序集。

因此,尝试将CopyLocal更改为True以获取该参考,并查看它是否变得更好。 Ralph提到的System.Data和System.Transactions随附框架。