11

根据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注册问题

这里描述了一个有点手动的修复:

反馈:无法为名为“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 接口不会改变,我只需要这样做一次。

希望在 Vista 上运行时 Visual Studio 2008 中的这个问题将在某个时候得到纠正,但如果没有,希望这篇文章对发现自己处于相同情况的其他人有所帮助......

也可以看看:

如何在自动化服务器列表中安装并注册用 VB.NET 编写的 COM Server for Excel?

——迈克

4

4 回答 4

2

您的regasm命令是否包含/codebase标志?

于 2009-04-13T02:16:29.950 回答
2

我知道这是很久以前的事了,但我找不到任何明智的答案。我遇到了类似的问题,解决方法是以安装它的同一用户身份运行 Visual Studio。如果我以其他用户身份运行它,除了 COM 注册之外的所有内容都可以正常工作。

于 2011-09-22T16:14:39.860 回答
0

如果你在 Vista 下运行 VS2008,它不会给出警告,但没有提升。Elevated 是我们(Vista 用户)学习始终使用该东西的方式,但出于某种原因,它更喜欢另一种方式。

注意:虽然提升了,但我为 SQL Server Tools 启动了某种安装,我最终能够通过,但是当运行没有提升时,它会尝试再次执行此操作并因权限问题而失败。不过,它似乎不会影响实际的构建结果。

于 2009-07-22T00:13:25.237 回答
0

注册表中将缺少 Typelib 注册表项。您需要使用 Microsoft.NET\framework\ 文件夹中的 regtlibv12 [path]MyTypeLib.tlb 来获取您构建程序集所用的 .NET 版本。完成此操作后,其他注册表项将存在,并且 VBA 引用可以找到它。或者,对于 Windows 10,我在 windows 文件夹中使用 regtlib.exe [path]MyTypeLib.tlb 然后您必须重新收集安装程序的组件,以便它现在具有 typelib 条目。我个人使用 wix 安装程序,并为此使用“加热”。Regasm /regfile 不会这样做。在 .dll 和 .tlb 上使用 heat 来获取 classid 和 typelib 注册表项

于 2016-09-23T16:36:52.250 回答