MIDL 未生成 tlb

问题描述 投票:0回答:1

我正在尝试使用 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/

从C++调用C#代码,但ExecuteInDefaultAppDomain()太有限了

当 MIDL 无法创建 tlb 时怎么办?

c# c++ com idl midl
1个回答
0
投票

仅包含接口声明的 IDL 文件不会生成 TLB,您需要声明包含接口的库。它可能还需要组件类声明,具体取决于您的具体要求。

© www.soinside.com 2019 - 2024. All rights reserved.