我创建了一个.NET程序集,根据Phil Wilson的杰出文章 构建和部署.NET COM程序集 ,该程序集暴露给COM。
一切都正常工作,即.NET程序集已正确注册为COM,编译的COM代码可以调用它而没有任何问题。
唯一奇怪的是,当使用VB 6.0或VBA开发针对公开的COM .NET程序集时,需要浏览到相关.tlb文件的确切文件位置,然后一切都可以正常工作。也就是说,类库不会直接显示在“引用”对话框中,因此您必须浏览到文件位置。
再次强调,COM互操作方面的功能确实百分之百可行;但是,我认为必须有某些设置,使得VB 6.0和VBA中的库可以直接在“引用”对话框中显示。
有人知道这个设置是什么吗?还是说只要注册了,这应该自动发生?
非常感谢任何建议...
迈克 编辑/更新 为了回答jpoh的问题,我想说明一下我正在使用.msi安装程序包,而不是显式地使用RegAsm,并且程序集已经被正确注册。可以在HKCR\CLSID{myGUID}\InprocServer32中看到,“CodeBase”键正确保存了程序集的完整路径。编译后的COM组件可以很好地执行该dll,但只有在使用VB 6.0或VBA进行开发时,它们才不会出现在“引用”对话框中。因此,我需要“浏览”到正确的文件位置,之后就可以完美地工作了。
更新#2
进一步研究后发现,尽管类GUID已经被正确注册,但我的.tlb文件没有被注册。我不知道为什么。注册.tlb文件应该在HKCR\Interface{myInterfaceGUID}上放置一些接口的注册表条目,但这并没有发生。奇怪的是,这种缺乏注册似乎不影响dll的功能,除了在VB6和VBA的“引用”对话框中无法找到它。
设置项目中我的.tlb文件的属性似乎是正确的:'PackageAs'属性设置为'vsdpaDefault','Register'属性设置为'vsdrfCOM'。我困惑于为什么这不能成功地安装在目标计算机上。
更新#3
好吧,事实证明设置项目并没有成功构建...尽管它报告“构建成功”。
实际上,有一个构建警告(令人惊讶的是,这是一个警告而不是错误),报告说它无法为文件名为“DotNetLibrary3.tlb”的文件创建注册信息。由于这是一个警告而不是错误,编译状态显示“构建成功”,而错误列表未打开。
追踪下来,似乎在Vista是您的开发机器时尝试创建安装程序项目时,可能会出现此问题,如此处所述: 在VS2008设置项目中出现COM类型库注册问题 这里描述了一种有点手动的修复方法: 反馈:无法为名为“文件名”的文件创建注册信息 我还没有尝试过修复方法,但明天我会尝试并报告是否解决了问题。
第四次更新
那做得不太好……看起来当在Vista上运行时,如该文章所建议的运行RegCap.exe是无效的。由于RegCap实际上是由设置项目自身在创建.msi时内部运行的,因此这并不奇怪。简而言之,安装程序项目几乎肯定失败,因为它调用的RegCap命令失败了……因此直接调用RegCap是没有帮助的。
底线是,这只是在Vista上创建安装包时遇到的一个错误。或者,可能是Visual Studio 2008和Vista的组合,我不确定。在Windows XP上运行的Visual Studio 2005上尝试完全相同的方法来创建设置项目没有任何问题。
很可能有修复程序可以在Vista和/或Visual Studio 2008上正确运行它,但我找不到它们。对我来说更有效的方法是使用Windows XP上的Visual Studio 2005构建以生成COM注册要求,然后将它们导入我的Visual Studio 2008设置项目。可以通过针对dll使用/regfile开关使用regasm和对.tlb文件使用RegCap(在W'XP上运行!)将它们导出为.REG文件。由于我的COM接口不会改变,因此我只需要做一次。
希望在运行于Vista上的Visual Studio 2008中解决这个问题,但如果不能,希望这篇文章对发现自己处于同样情况的其他人有所帮助...
另请参阅: 如何在VB.NET中编写的Excel COM服务器中获取已安装并注册的自动化服务器列表? - Mike
一切都正常工作,即.NET程序集已正确注册为COM,编译的COM代码可以调用它而没有任何问题。
唯一奇怪的是,当使用VB 6.0或VBA开发针对公开的COM .NET程序集时,需要浏览到相关.tlb文件的确切文件位置,然后一切都可以正常工作。也就是说,类库不会直接显示在“引用”对话框中,因此您必须浏览到文件位置。
再次强调,COM互操作方面的功能确实百分之百可行;但是,我认为必须有某些设置,使得VB 6.0和VBA中的库可以直接在“引用”对话框中显示。
有人知道这个设置是什么吗?还是说只要注册了,这应该自动发生?
非常感谢任何建议...
迈克 编辑/更新 为了回答jpoh的问题,我想说明一下我正在使用.msi安装程序包,而不是显式地使用RegAsm,并且程序集已经被正确注册。可以在HKCR\CLSID{myGUID}\InprocServer32中看到,“CodeBase”键正确保存了程序集的完整路径。编译后的COM组件可以很好地执行该dll,但只有在使用VB 6.0或VBA进行开发时,它们才不会出现在“引用”对话框中。因此,我需要“浏览”到正确的文件位置,之后就可以完美地工作了。
更新#2
进一步研究后发现,尽管类GUID已经被正确注册,但我的.tlb文件没有被注册。我不知道为什么。注册.tlb文件应该在HKCR\Interface{myInterfaceGUID}上放置一些接口的注册表条目,但这并没有发生。奇怪的是,这种缺乏注册似乎不影响dll的功能,除了在VB6和VBA的“引用”对话框中无法找到它。
设置项目中我的.tlb文件的属性似乎是正确的:'PackageAs'属性设置为'vsdpaDefault','Register'属性设置为'vsdrfCOM'。我困惑于为什么这不能成功地安装在目标计算机上。
更新#3
好吧,事实证明设置项目并没有成功构建...尽管它报告“构建成功”。
实际上,有一个构建警告(令人惊讶的是,这是一个警告而不是错误),报告说它无法为文件名为“DotNetLibrary3.tlb”的文件创建注册信息。由于这是一个警告而不是错误,编译状态显示“构建成功”,而错误列表未打开。
追踪下来,似乎在Vista是您的开发机器时尝试创建安装程序项目时,可能会出现此问题,如此处所述: 在VS2008设置项目中出现COM类型库注册问题 这里描述了一种有点手动的修复方法: 反馈:无法为名为“文件名”的文件创建注册信息 我还没有尝试过修复方法,但明天我会尝试并报告是否解决了问题。
第四次更新
那做得不太好……看起来当在Vista上运行时,如该文章所建议的运行RegCap.exe是无效的。由于RegCap实际上是由设置项目自身在创建.msi时内部运行的,因此这并不奇怪。简而言之,安装程序项目几乎肯定失败,因为它调用的RegCap命令失败了……因此直接调用RegCap是没有帮助的。
底线是,这只是在Vista上创建安装包时遇到的一个错误。或者,可能是Visual Studio 2008和Vista的组合,我不确定。在Windows XP上运行的Visual Studio 2005上尝试完全相同的方法来创建设置项目没有任何问题。
很可能有修复程序可以在Vista和/或Visual Studio 2008上正确运行它,但我找不到它们。对我来说更有效的方法是使用Windows XP上的Visual Studio 2005构建以生成COM注册要求,然后将它们导入我的Visual Studio 2008设置项目。可以通过针对dll使用/regfile开关使用regasm和对.tlb文件使用RegCap(在W'XP上运行!)将它们导出为.REG文件。由于我的COM接口不会改变,因此我只需要做一次。
希望在运行于Vista上的Visual Studio 2008中解决这个问题,但如果不能,希望这篇文章对发现自己处于同样情况的其他人有所帮助...
另请参阅: 如何在VB.NET中编写的Excel COM服务器中获取已安装并注册的自动化服务器列表? - Mike