【问题标题】: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,而不是在注册表中寻找它们。

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 2014-07-26
        • 1970-01-01
        • 2018-08-14
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-21
        • 2011-04-11
        相关资源
        最近更新 更多