我正在开发一个创建.msi文件的安装程序。有一个与之关联的CustomAction程序,它是用C#编写的。在此CustomAction程序中有三个COM对象引用,它们是必需的,以便它可以工作。它们如下。
- Active DS IIS命名空间提供(C:\ Windows \ System32 \ inetsrv \ adsiis.dll)
- Windows脚本宿主对象模型(C:\ Windows \ System32 \ wshom.ocx)
- NetFwTypeLib(C:\ Windows \ System32 \ FirewallAPI.dll)
醇>
作为补充信息,以下是我在程序中使用这些DLL的任务。
- 为特定文件类型设置MIME设置。
- 创建文件夹的桌面快捷方式。
- 将程序注册为防火墙例外
醇>
现在,这是我的问题。当我重建C#程序并从Visual Studio中执行CustomAction程序时,它工作正常,我可以像魅力一样完成上述三个任务。但是,当我实际构建.msi并尝试执行它并在我的系统上安装程序时,它会出错。我正在使用日语操作系统,所以它给出了日语错误,所以我会尝试尽可能地将错误信息翻译成英语。错误是这样的:
*
文件或程序集'Interop.IISOle, 版本= 1.0.0.0,文化=中立, PublicKeyToken = null',或其中一个 无法加载依赖项。 找不到指定的文件。
*
给出了这个特定的错误消息,因为它与第一个dll(adsiis.dll)有关,因为它是包含IISOle命名空间的那个。类似地,它给出了与我从程序中引用的所有三个COM对象相关的错误消息。现在我能从中理解的是,不知何故,当这段代码在.msi文件中时,它找不到合适的COM对象。我真的很困惑,为什么会发生这种情况,因为当我尝试安装程序时,即使在我用来编写CustomAction的同一台机器上,安装程序也会出现同样的错误。有趣的是,它可以通过Visual Studio界面完美地执行。请帮我这个。提前谢谢!
请注意,我正在使用Windows Vista Business,但我需要安装程序才能安装在从Windows Server 2003到Windows 7的各种Windows操作系统上。
答案 0 :(得分:4)
今天刚遇到这个。转到“打开或关闭Windows功能”并找出IIS下的所有内容,包括IIS 6内容。
确保选中“IIS信息服务器和IIS 6配置兼容性”功能,可在“Internet信息服务”>下找到。 “Web管理工具”> “IIS 6管理兼容性”。
答案 1 :(得分:1)
安东,最后我发现了什么是错的。
当我引用dsiis.dll时,Visual Studio会在我的CustomAction程序的bin目录中放置一个Interop模块,即Interop.IISOle.dll。哪个也可以找到CustomAction.exe。当我引用其他两个COM对象时,它执行相同的过程; wshom.ocx和FirewallAPI.dll。但是我使用Wix编写的实际安装程序将此CustomAction.exe复制到其他目录,而.msi使用该特定的CustomAction.exe文件。问题出现,因为在那里找不到Interop.IISOle.dll(以及其他人)。 (错误信息表示我从一开始就需要寻找的东西;我很愚蠢,不去寻找它,但认为可能会有更大的问题)
所以这就是我所做的。我指示Wix项目将这些Interop DLL文件复制到安装程序使用的CustomAction.exe所在的位置。这很容易解决问题。
对于Wix来说,我完全是新手,而且由于某些原因我们需要使用CustomAction for 2和3。