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

发布于 2024-07-16 07:05:46 字数 247 浏览 6 评论 0原文

当我通过将 COM 程序集 (dll) 添加为引用将其导入 Visual Studio 项目时,我可以毫无问题地使用生成的等效公共语言运行时程序集。

但是,如果我尝试使用 tlbimp 将相同的 COM 程序集转换为公共语言运行时程序集,我会遇到各种问题。

有没有办法复制 Visual Studio 与 tlbimp 一起使用的设置? 或者换句话说,有没有办法使用 tlbimp 生成与 Visual Studio 相同的互操作类?

When I import a COM assembly (dll) in to a Visual Studio project by adding it as a reference I can use the generated equivalent common language runtime assembly without issue.

However if I try and convert the same COM assembly into a common language runtime assembly using tlbimp I run in to all kinds of problems.

Is there a way to replicate the settings that Visual Studio uses with tlbimp?
Or to put it another way, is there a way to generate the same interop class as visual studio does by using tlbimp?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断桥再见 2024-07-23 07:05:46

我自己找到了解决方案。 要复制 Visual Studio 与 tlbimp 一起使用的设置,您只需使用 /out 和 /namespace 标志。

out 标志用于为“Interop”添加前缀。 在生成的文件上,命名空间标志用于将默认命名空间设置为 COM 程序集的名称。

例如

tlbimp /out:Interop.MyCom.dll /namespace:MyCom MyCom.dll

I found the solution myself. To replicate the settings that Visual Studio uses with tlbimp you simply need to use the /out and /namespace flags.

The out flag is used to prefix "Interop." on the generated file and the namespace flag is used to set the default namespace to the name of the COM assembly.

e.g.

tlbimp /out:Interop.MyCom.dll /namespace:MyCom MyCom.dll
回眸一笑 2024-07-23 07:05:46

还有更多,您还需要使用 /sysarray 选项,否则您会发现您的应用程序会随机崩溃,并出现假定的 EngineExceptions 引用内存损坏。

这将为您提供与 Visual Studio 生成的相同的 ilcode。

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

[剩下的脑残渣]
使用 tlbimp(尤其是使用 msbuild 脚本)的好处是,您可以让您的产品正确构建 64 位和 32 位目标。

否则,您最终会使用最后 regsvr32 的 tlb 得到 64 位构建目标,这些目标很可能是具有 32 位接口的 32 位 com 对象。

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

there is a little more to it, you also need to use the /sysarray option otherwise you will find your app will randomly crash with supposed EngineExceptions citing memory corruption.

This will give you identical ilcode to that generated by visual studio.

specify the /namespace parameter to match (including case) the library clause in the tlb file. (can use oleview.exe to view tlbs directly).

[rest of brain dump]
The upside of using tlbimp, especially from an msbuild script is that you can then get your product to properly build for both 64 and 32 bit targets.

otherwise you end up with a 64 bit build targets using the tlbs that were last regsvr32'd which are most likely the 32 bit com objects with 32 bit interfaces.

If doing 64 and 32 bit, use both /reference and /tlbreference so that it uses the interops and tlbs you pass on the command line rather than fishing in the registry for them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文