当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《使用WiX安装程序复制VisualStudioCOM注册》经验,为你挑选了2个好方法。

曾几何时,一位年轻,天真的工程师认为将他的应用程序的一些功能分成一个用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注册表项中创建其他子项,并在其中注册typelib HKLM\SOFTWARE\Classes\TypeLib.

Tallow没有给出任何帮助,抱怨说.tlb不是一个文件.也不是WiX 3.0测试版 - 这似乎有更多的问题让事情发挥作用.

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

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

所以,我的好伙伴,Windows爱好者和WiX用户都有两个问题:

WiX可以本地注册的类型库吗?如果是这样,怎么样?

如果没有,使用Windows安装程序注册typelib的正确方法是什么?

此外,我想作为另一部分,Visual Studio如何确定如何注册typelib?(编辑:看起来关于typelib注册的MSDN库文章有所需的密钥的名称,但我仍然需要弄清楚如何获取uuid的.(这是关于typelib的博客文章和Larry Osterman的COM注册.))再读一点,手动注册这些位可能会让我失望,但我希望不是......

我评估了输出regasm /regfile:MyDll.dll MyDll.dll.看起来这些是wix为dll生成的密钥.Regasm的另一种模式,regasm /tlb:生成并注册程序集的类型库,但是,

/ regfile [:FileName]生成具有指定名称的reg文件,而不是注册类型.此选项不能与/ u或/ tlb选项一起使用

似乎/ regfile开关与/ tlb开关不兼容.Khaaaaaaaan!

进一步更新:看起来您实际上不需要包含.tlb文件. 根据wix的typelib元素上的这篇文章,MSI可以在设置过程中创建/注册它.这一切都归结为通过获取正确的属性来配置WiX文档以实际安装它.

我后来发现你可以直接在.tlb上使用热量来获得正确的属性!有关更多信息,请参阅此SO问题.



1> CheGueVerra..:

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

就像是

heat file MyComExposedLibrary.dll -out MyComExposedLibrary.wxs

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



2> hurcane..:

我最近遇到了这个问题,我能找到的最简单的解决方法是在开发机器上执行以下步骤:

    运行:Regasm MyDLL.dll /tlb:MyDLL.tlb

    运行:加热文件MyDLL.dll -out MyDll-1.wxs

    运行:加热文件MyDll.tlb -out MyDll-2.wxs

MyDll-2.wxs包含一个元素,您需要复制并嵌套在MyDll-1.wxs中生成的元素中.这将为您提供可在安装程序项目中使用的完整元素.


@SanderRijken这就是你如何让tlb通过热量.我不明白你为什么说如果你需要它产生的tlb来运行热量,你就不需要运行regasm.(?)
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有