【问题标题】:Referencing a COM assembly in Visual Studio vs converting a COM assembly via tlbimp.exe在 Visual Studio 中引用 COM 程序集与通过 tlbimp.exe 转换 COM 程序集
【发布时间】:2010-10-17 10:17:43
【问题描述】:
当我通过将 COM 程序集 (dll) 添加为引用将其导入 Visual Studio 项目时,我可以毫无问题地使用生成的等效公共语言运行时程序集。
但是,如果我尝试使用 tlbimp 将相同的 COM 程序集转换为公共语言运行时程序集,则会遇到各种问题。
有没有办法复制 Visual Studio 与 tlbimp 一起使用的设置?
或者换句话说,有没有办法通过使用 tlbimp 来生成与 Visual Studio 相同的互操作类?
【问题讨论】:
标签:
visual-studio
assemblies
reference
tlbimp
【解决方案1】:
我自己找到了解决方案。要复制 Visual Studio 与 tlbimp 一起使用的设置,您只需使用 /out 和 /namespace 标志。
out 标志用于为“Interop”添加前缀。在生成的文件上,命名空间标志用于将默认命名空间设置为 COM 程序集的名称。
例如
tlbimp /out:Interop.MyCom.dll /namespace:MyCom MyCom.dll
【解决方案2】:
还有一点,您还需要使用 /sysarray 选项,否则您会发现您的应用会随机崩溃,并出现假定的 EngineExceptions 引用内存损坏。
这将为您提供与 Visual Studio 生成的相同的 ilcode。
指定 /namespace 参数以匹配(包括大小写) tlb 文件中的 library 子句。 (可以使用oleview.exe直接查看tlbs)。
[大脑转储的其余部分]
使用 tlbimp 的好处,尤其是来自 msbuild 脚本的好处是,您可以让您的产品为 64 位和 32 位目标正确构建。
否则,您最终会使用最后一次 regsvr32 的 tlb 获得 64 位构建目标,这很可能是具有 32 位接口的 32 位 com 对象。
如果使用 64 位和 32 位,请同时使用 /reference 和 /tlbreference,以便它使用您在命令行中传递的 interops 和 tlbs,而不是在注册表中寻找它们。