根据Phil Wilson撰写的特殊文章Build and Deploy a .NET COM Assembly ,我创建了一个暴露给 COM 的 .NET 程序集。
在 .NET 程序集为 COM 正确注册的意义上,一切正常,并且编译后的 COM 代码可以毫无问题地调用它。
唯一奇怪的是,在使用 VB 6.0 或 VBA 时针对 COM 公开的 .NET 程序集进行开发需要程序员“浏览”到相关 .tlb 文件的确切文件位置,之后一切正常。也就是说,类库不会直接显示在“引用”对话框中,因此您必须浏览到文件位置。
同样,COM 互操作方面确实 100% 有效;但是,我认为必须有一些设置可以使库在 VB 6.0 和 VBA 的“引用”对话框中直接可见。
有谁知道这个设置是什么?或者这是否应该通过注册而自动为我发生?
非常感谢您的任何建议...
麦克风
编辑/更新
要回答 jpoh 关于我是否使用 /codebase 开关的问题,我使用的是 .msi 安装包,而不是明确使用 RegAsm。程序集已正确注册,这可以从以下事实看出:在 HKCR\CLSID{myGUID}\InprocServer32 中,“CodeBase”键正确地保存了程序集的完整路径。编译后的 COM 组件对这个 dll 执行得很好,只有在使用 VB 6.0 或 VBA 对其进行开发时,它们才不会出现在引用对话框中。因此,我需要“浏览”到正确的文件位置,之后它可以 100% 正常工作。
更新#2
经过进一步研究,似乎虽然类 GUID 已正确注册,但我的 .tlb 文件未注册。我不知道为什么不。注册 .tlb 文件应该在 HKCR\Interface{myInterfaceGUID} 中为我的类所基于的接口放置一些注册表项,但这不会发生。奇怪的是,除了在 VB6 和 VBA 的引用对话框中的可发现性之外,这种缺少注册似乎并没有影响 dll 的功能。
安装项目中我的 .tlb 文件的属性似乎是正确的:“PackageAs”属性设置为“vsdpaDefault”,“Register”属性设置为“vsdrfCOM”。我很困惑为什么这不会成功地安装在目标机器上。
更新#3
好的,事实证明安装项目没有成功构建......尽管它报告“构建成功”。
实际上有一个构建警告(令人惊讶的是,警告,而不是错误)被报告为“无法为文件名'DotNetLibrary3.tlb'创建注册信息”。由于这是一个警告,而不是错误,因此编译说明“构建成功”并且错误列表没有打开。
跟踪这一点,当您在 Vista 是您的开发机器时尝试创建安装项目时,这似乎是一个问题,如下所述:
VS2008 Setup项目中COM typelib注册问题
这里描述了一个有点手动的修复:
我还没有尝试修复,但我明天会,如果解决了我会报告。
更新#4
效果不太好……在 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 安装项目中。这些可以通过 regasm 导出为 .REG 文件,对 dll 使用 /regfile 开关,对 .tlb 文件使用 RegCap(在 W'XP 上运行!)。由于我的 COM 接口不会改变,我只需要这样做一次。
希望在 Vista 上运行时 Visual Studio 2008 中的这个问题将在某个时候得到纠正,但如果没有,希望这篇文章对发现自己处于相同情况的其他人有所帮助......
也可以看看:
如何在自动化服务器列表中安装并注册用 VB.NET 编写的 COM Server for Excel?
——迈克