如何将COM暴露的.NET项目添加到VB6(或VBA)引用对话框?

时间:2009-04-13 02:03:18

标签: vba deployment vb6 com-interop setup-project

根据Phil Wilson的特殊文章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的References对话框中可见。

有谁知道这个设置是什么?或者只是通过注册才能自动发生这种情况?

提前感谢任何建议......

麦克

修改/更新

要回答jpoh关于我是否正在使用/ codebase开关的问题,我使用的是.msi安装程序包,而不是显式使用RegAsm。正确地注册了程序集,可以看出,在HKCR \ CLSID {myGUID} \ InprocServer32中,'CodeBase'键正确保存了程序集的完整路径。编译的COM组件对这个dll执行就好了,只有在使用VB 6.0或VBA进行开发时它们才会出现在引用对话框中。因此,我需要“浏览”到正确的文件位置,之后它可以100%正常工作。

更新#2

经过进一步研究,似乎虽然正在正确注册类GUID,但我的.tlb文件尚未注册。我不知道为什么不。注册.tlb文件应该为我的类基于HKCR \ Interface {myInterfaceGUID}的接口放置一些注册表项,但是这没有发生。奇怪的是,这种缺乏注册似乎并没有影响dll的功能,除了它在VB6和VBA的参考对话框中的可发现性。

安装项目中我的.tlb文件的属性似乎是正确的:'PackageAs'属性设置为'vsdpaDefault','Register'属性设置为'vsdrfCOM'。我很困惑为什么不能在目标机器上成功安装它。

更新#3

好的,事实证明安装项目正在成功构建......尽管它报告“构建成功”。

实际上有一个构建警告(令人惊讶的是,警告,而不是错误)被报告为“无法为文件名创建注册信息'DotNetLibrary3.tlb'”。由于这是一个警告,而不是错误,编译声明“Build Succeeded”,错误列表打开。

跟踪此情况,当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开关,并使用RegCap(在W'XP!上运行)对.tlb文件。由于我的COM接口不会改变,我只需要做一次。

希望在Vista上运行时Visual Studio 2008中的这个问题会在某些时候得到纠正,但如果没有,希望这篇文章对于在相同情况下发现自己的其他人有一定的价值......

另见:

How to get COM Server for Excel written in VB.NET installed and registered in Automation Servers list?

- 迈克

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果您在Vista下运行VS2008但未提升,则不会发出警告。提升是我们(Vista用户)学会总是使用这个东西的方式,但为此,出于某种原因,它更喜欢它的另一种方式。

N.B。:在升级时,我为SQL Server工具启动了一些我最终能够通过的安装,但是当运行不升级时,它会再次尝试执行此操作并因许可问题而失败。但它似乎并没有影响实际的构建结果。

答案 3 :(得分:0)

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