我正在尝试使用 COM 互操作,特别是 .net core 和 C++。我有一个 .net core 库,我正在尝试将其公开给 C++ 代码库。
dotnet 文档提到:
与 .NET Framework 不同,.NET Core 或 .NET 5+ 不支持从 .NET 程序集生成 COM 类型库 (TLB)。指南是为 COM 接口的本机声明手动编写 IDL 文件或 C/C++ 标头。如果您决定编写 IDL 文件,则可以使用 Visual C++ SDK 的 MIDL 编译器对其进行编译以生成 TLB。
我尝试创建自己的 IDL 文件来声明我想要创建的接口:
import "oaidl.idl";
import "ocidl.idl";
[object, uuid(9526A66B-200B-4157-AEDC-56F084962031), pointer_default(unique)]
interface IMyInterface : IUnknown {
HRESULT StartMethodA();
HRESULT StartMethodB();
};
我正在使用
midl.exe test.idl
进行编译(我还使用了额外的 tlb
参数)。但是,此编译步骤仅创建 .h
和 .c
文件,而不是 .tlb
。
我还研究了反向 pinvoke 和 dllexport。在这两种情况下(根据我的理解)我都需要提供我的 c# 作为静态方法。我可以通过创建一个静态函数来实现此目的,该函数创建一个我需要调用其成员函数的对象的新实例。然而,这确实感觉像是令人讨厌的解决方法。
我对 COM 很陌生,正在编写 C++ 和 .net core 之间的“桥梁”,希望有人能给我一些指导,让这个工作能够发挥作用。
资源
如何通过 COM 公开 .netstandard2.0 库以便在 VB6 中使用?
https://learn.microsoft.com/en-us/windows/win32/midl/com-dcom-and-type-libraries#type-library
https://mark-borg.github.io/blog/2017/interop/
仅包含接口声明的 IDL 文件不会生成 TLB,您需要声明包含接口的库。它可能还需要组件类声明,具体取决于您的具体要求。