根据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中的这个问题会在某些时候得到纠正,但如果没有,希望这篇文章对于在相同情况下发现自己的其他人有一定的价值......
另见:
- 迈克
答案 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注册表项