2

我正在开发一个创建 .msi 文件的安装程序。有一个与之关联的 CustomAction 程序,它是用 C# 编写的。在此 CustomAction 程序中创建了三个 COM 对象引用,这些引用是其正常工作所必需的。它们如下。

  1. 活动 DS IIS 命名空间提供 (C:\Windows\System32\inetsrv\adsiis.dll)
  2. Windows 脚本宿主对象模型 (C:\Windows\System32\wshom.ocx)
  3. NetFwTypeLib (C:\Windows\System32\FirewallAPI.dll)

作为补充信息,以下是我在程序中使用这些 DLL 的任务。

  1. 为特定文件类型设置 MIME 设置。
  2. 创建文件夹的桌面快捷方式。
  3. 将程序注册为防火墙例外

.

现在,这是我的问题。当我在 Visual Studio 中重建 C# 程序并执行 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 操作系统上。

4

2 回答 2

4

今天刚遇到这个。转到“打开或关闭 Windows 功能”并确定 IIS 下的所有内容,包括 IIS 6 的内容。

确保选中“Internet 信息服务”>“Web 管理工具”>“IIS 6 管理兼容性”下的“IIS 元数据库和 IIS 6 配置兼容性”功能。

于 2012-06-21T22:00:27.433 回答
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 用于 2 和 3。

于 2010-05-13T07:16:53.420 回答