vba - 如何将 COM 公开的 .NET 项目添加到 VB6(或 VBA)引用对话框?

标签 vba deployment vb6 com-interop setup-project

我根据异常(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/

相关文章:

excel - “C :\blp\API\Office Tools\BloombergUI. xla”!不断将其自身添加到我的 Excel 公式中

ruby-on-rails - Heroku 错误 H10 -(应用程序崩溃)

vb.net - 什么是二进制比较以及它与文本比较有何不同

vb.net - VB6 和 VB.net 中的 IsNull

string - 如何从字符串中查找数字?

vba - 如何让 VBA 在单击用户窗体中的任何复选框时运行?

arrays - VBA检查多维变量的整行是否为空而不循环

deployment - JBoss5 : Cannot deploy due to java. util.zip.ZipException:打开 zip 文件时出错

java - Glassfish部署项目的依赖库

c++ - 使用 VB6 和 C++ dll 的 MSVBVM60.dll 中的访问冲突