曾几何时,一位年轻,天真的工程师认为将他的应用程序的一些功能分成一个用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
.问题是,据我所知,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问题.
您应该使用位于您正在使用的版本的bin目录中的Heat(WIX 3.0).看看这篇博客文章,我们在这里使用它来注册所有的COM对象,通过创建一个wix片段...
就像是
heat file MyComExposedLibrary.dll -out MyComExposedLibrary.wxs
之后,阅读你的编辑,我会用wix创建一个基本的msi,只安装com对象,看看是否有效...然后你就会知道要攻击的战场......
我最近遇到了这个问题,我能找到的最简单的解决方法是在开发机器上执行以下步骤:
运行:Regasm MyDLL.dll /tlb:MyDLL.tlb
运行:加热文件MyDLL.dll -out MyDll-1.wxs
运行:加热文件MyDll.tlb -out MyDll-2.wxs
MyDll-2.wxs包含一个
元素,您需要复制并嵌套
在MyDll-1.wxs中生成的元素中.这将为您提供
可在安装程序项目中使用的完整元素.