.net - 使用 WiX 安装程序复制 Visual Studio COM 注册

标签 .net windows com wix typelib

曾几何时,一位年轻、天真的工程师认为将他的应用程序的某些功能分离到一个用 C# 编写的 COM 组件中是个好主意。 Visual Studio 拥有做到这一点的所有工具,对吗? .NET 实际上就是为此而生的,对吧?哈!他说,这会很容易。我将对组件进行适当的分离,使业务逻辑远离前端,并且使用 COM,我将能够从任何地方使用它!他兴高采烈地查看了register for COM interop项目属性中的复选框,公开他想要的类,然后继续前进。

呵呵,试炼做出这样的选择。现在年轻的工程师更有经验,现在不会希望任何人都这样。然而,重担已经压在了他的肩上,重担依旧沉重。他想减轻负担。

随之而来的是 WiX,这是一种从 XML 生成 Windows Installer 文件的工具。这引起了他的兴趣 - 它可以很简单地从少数配置文件中复制正确的 Windows 安装程序文件所需的大部分代码。他的视线在抬头。

使用 WiX 2.0,他可以很容易地生成注册 C# COM 对象所需的文件。这涉及使用工具牛油。他会做如下事情:

tallow -c -nologo MyComExposedLibrary.dll > MyComExposedLibrary.wxs

然后将其修复(起初这是手动完成的,但最终我将这些步骤记录到一个小工具中,设置了最终目录引用 ID、组件 ID、文件 ID、GUID 和代码库)。

然后,随后的安装程序将安装,如果应用程序正常运行,将会有欢乐的庆祝事件。

它没有。

几天来,这位年轻的工程师倾诉了他的开发 PC 和测试安装 PC 的差异。 “所有的注册表项都是一样的!”他会惊呼。 “MyComExposedLibrary 的所有内容都已注册,我发誓!”

除了,它不是。

在第三天的黎明,在经历了许多山露水之后,他意识到 Visual Studio 正在注册的另一个对象不是他的安装程序:MyComExposedLibrary.tlb 文件。

显然,Visual Studio 一直在注册这个文件,在 HKLM\Software\Classes\Interface 中创建了额外的子项。注册表项,并在 HKLM\SOFTWARE\Classes\TypeLib 中注册 typelib .

Tallow 没有提供任何帮助,提示 .tlb 不是它所处理的文件。也不是 WiX 3.0 测试版——这似乎在让事情正常工作时遇到了更多问题。

我也试了一下热火。这生成了注册表元素和类元素。我清理了 heat 的输出,然后去编译它,但得到了一个不同的错误:error LGHT0130 : The primary key <uuid here> is duplicated in table 'Registry' .问题是,据我所知,uuid 实际上并不存在于我的任何 wxs 源文件中。如果我更改功能元素中的组件引用顺序,则不同的 dll 组件会出现该错误。由于我未能成功编译项目的 WiX 3.0 版本,因此我无法确认 heat 是否提供了正确的输出。

除了导致出现此错误的程序集之一,我从安装程序中删除了所有内容,并尝试再次编译。我得到了同样的错误。啊!

所以,我的好伙伴、Windows 爱好者和 WiX 用户,有两个问题:
  • 类型库是 WiX 可以本地注册的东西吗?如果是这样,如何?
  • 如果没有,使用 Windows 安装程序注册 typelib 的正确方法是什么?

  • 另外,我想作为另一部分,Visual Studio 如何确定如何注册 typelib? (编辑:看起来是 MSDN library article on typelib registration has the names of the keys needed ,但我仍然需要弄清楚如何获得 uuid。(这是来自 this blog post on typelib and COM registration by Larry Osterman 。))再读一点,我可能会手动注册这些位,但我希望不是...

    我评估了 regasm /regfile:MyDll.dll MyDll.dll 的输出.看起来这些 key 与 wix 为 dll 生成的 key 相同。 Regasm 的其他模式,regasm /tlb:<filename>为程序集生成并注册类型库,但是,

    /regfile[:FileName] Generate a reg file with the specified name instead of registering the types. This option cannot be used with the /u or /tlb options



    似乎/regfile 开关与/tlb 开关不兼容。啊啊啊啊啊!

    进一步更新:看起来您实际上并不需要包含 .tlb 文件。 According to this post on wix's typelib element ,MSI 可以创建/注册它作为设置过程的一部分。这一切都归结为配置 WiX 文档以通过获取正确的属性来实际安装它。

    后来我发现你可以直接在 .tlb 上使用 heat 来获得正确的属性!见 this SO question for more information .

    最佳答案

    您应该使用位于您所使用版本的 bin 目录中的 Heat (WIX 3.0)。
    看看这个 blog后,我们在这里使用它来注册我们所有的 COM 对象,通过创建一个 wix 片段...

    就像是

    heat file MyComExposedLibrary.dll -out MyComExposedLibrary.wxs
    

    之后,阅读您的编辑,我将创建一个带有 wix 的基本 msi,它只安装 com 对象,看看它是否有效......然后你就会知道要攻击哪个战场......

    关于.net - 使用 WiX 安装程序复制 Visual Studio COM 注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/543995/

    相关文章:

    windows - Win32 WM_CTLCOLORSTATIC 背景未完全填充

    windows - 如何在 Windows 中检查用户帐户是否存在(在本地计算机上)?

    c# - Visual Studio 2010 自动化和环境变量

    c# - 如何使用 .net 框架创建我自己的报告控件?

    python - 使用Python从USB获取数据

    C#内存泄露、追踪技巧和工具

    c# - 在 C# 中获取 RichTextBox 的 ITextDocument

    c# - 如何通过 C# 外部应用程序访问 AutoCAD 应用程序的特定实例

    c# - NHibernate 3、动态组件、字典和 LINQ 查询

    c# - 如何在控件中使用 PreLoad 事件?