在Visual Studio中引用COM程序集与通过tlbimp.exe转换COM程序集的区别

3
当我将一个 COM 动态链接库作为引用添加到 Visual Studio 项目中时,我可以无问题地使用生成的等效公共语言运行时程序集。
然而,如果我尝试使用 tlbimp 将同一个 COM DLL 转换为公共语言运行时程序集,则会遇到各种问题。
有没有一种方法可以复制 Visual Studio 使用的 tlbimp 设置? 换句话说,是否有一种方法可以通过使用 tlbimp 生成与 Visual Studio 相同的互操作类?
2个回答

2
我自己找到了解决方案。为了复制Visual Studio与tlbimp使用的设置,您只需要使用/out和/namespace标志。
out标志用于在生成的文件上添加“Interop.”前缀,而namespace标志用于将默认命名空间设置为COM程序集的名称。
例如:
tlbimp /out:Interop.MyCom.dll /namespace:MyCom MyCom.dll

2

这还不够,您还需要使用/sysarray选项,否则您会发现您的应用程序会随机崩溃,并引用内存损坏的EngineExceptions。

这将为您提供与Visual Studio生成的完全相同的IL代码。

指定/namespace参数以匹配(包括大小写)tlb文件中的库子句。(可以使用oleview.exe直接查看tlbs)。

[脑袋倾倒的其余部分] 使用tlbimp的好处,特别是从msbuild脚本中,是您可以让产品正确地构建64位和32位目标。

否则,您最终会得到一个64位构建目标,使用的是上次regsvr32'd的tlbs,这些tlbs很可能是具有32位接口的32位com对象。

如果要进行64位和32位操作,请同时使用/reference和/tlbreference,以便它使用您在命令行中传递的互操作性和tlbs,而不是在注册表中寻找它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接