我根据异常(exception)文章 Build and Deploy a .NET COM Assembly 创建了一个暴露给 COM 的 .NET 程序集。通过菲尔威尔逊。
一切正常,因为 .NET 程序集已为 COM 正确注册,并且编译后的 COM 代码可以毫无困难地调用它。
唯一奇怪的是,在使用 VB 6.0 或 VBA 时针对暴露于 COM 的 .NET 程序集进行开发需要程序员“浏览”到关联的 .tlb 文件的确切文件位置,之后一切正常。也就是说,类库不会直接显示在“引用”对话框中,因此您必须浏览到文件位置。
同样,COM Interop 方面确实 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} 中放置我的类所基于的接口(interface)的一些注册表项,但这并没有发生。奇怪的是,这种缺乏注册似乎并没有影响 dll 的功能,除了它在 VB6 和 VBA 的引用对话框中的可发现性。
安装项目中我的 .tlb 文件的属性似乎是正确的:“PackageAs”属性设置为“vsdpaDefault”,“Register”属性设置为“vsdrfCOM”。我很困惑为什么这不能成功安装在目标机器上。
更新 #3
好吧,事实证明安装项目没有成功构建......尽管它报告“构建成功”。
实际上有一个构建警告(令人惊讶的是,警告,而不是错误)被报告为“无法为文件名‘DotNetLibrary3.tlb’创建注册信息”。由于这是一个警告而不是错误,编译显示“构建成功”并且错误列表没有打开。
跟踪这一点,当 Vista 是您的开发机器时,尝试创建安装项目时,这似乎可能是一个问题,如下所述:
COM typelib registration problem in VS2008 Setup project
这里描述了一些手动修复:
Feedback: Unable to create registration information for file named 'filename'
我还没有尝试过修复,但我明天会尝试,如果解决了,我会回来报告。
更新 #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 接口(interface)不会改变,所以我只需要做一次。
希望在 Vista 上运行时 Visual Studio 2008 中的这个问题会在某个时候得到纠正,但如果没有,希望这篇文章对那些发现自己处于相同情况的其他人有一定的值(value)......
另请参阅:
How to get COM Server for Excel written in VB.NET installed and registered in Automation Servers list?
——迈克
最佳答案
您的 regasm
命令包括 /codebase
旗帜?
关于vba - 如何将 COM 公开的 .NET 项目添加到 VB6(或 VBA)引用对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742851/