You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中调用C++库返回结构体实例的成员方法

在C#中调用C++纯虚类接口的实现方案

核心思路

C++返回的ILE440*是指向纯虚类实例的指针,底层依赖虚函数表实现多态。在C#中需通过定义匹配的接口映射虚函数表结构,再将指针转换为接口实例完成方法调用。


步骤1:修正CreateInstance的C#导入签名

原C++函数使用WINAPI(即__stdcall)调用约定,参数为ANSI编码的const char*,需修正DllImport定义:

[DllImport("lusbapi.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr CreateInstance([MarshalAs(UnmanagedType.LPStr)] string DeviceName);

步骤2:定义匹配C++虚类的C#接口

必须保证方法顺序、调用约定、参数/返回值类型与C++完全一致(虚函数表按声明顺序排列,顺序错误会导致调用崩溃):

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
// 任意生成一个GUID用于类型标识即可
[Guid("E12896B0-1234-5678-9ABC-DEF012345678")]
public interface ILE440
{
    [MethodImpl(MethodImplOptions.PreserveSig)]
    IntPtr GetModuleHandle();

    [MethodImpl(MethodImplOptions.PreserveSig)]
    bool OpenLDevice(ushort VirtualSlot);

    // 在此添加C++ ILE440中剩余的虚方法,顺序必须与C++声明完全一致
}
  • InterfaceType.InterfaceIsIUnknown:模拟C++虚表的内存结构(实例首个成员为虚表指针)
  • PreserveSig:禁止CLR自动转换返回值为HRESULT,保持原类型匹配
  • 类型映射规则:HANDLE→IntPtr,WORD→ushort,C++bool→C#bool

步骤3:指针转接口实例并调用方法

通过Marshal.GetTypedObjectForIUnknown将C++指针转换为C#接口实例,之后即可直接调用成员方法:

// 创建C++实例
string deviceName = "你的设备名称";
IntPtr instancePtr = CreateInstance(deviceName);
if (instancePtr == IntPtr.Zero)
{
    // 处理实例创建失败逻辑
    Console.WriteLine("实例创建失败");
    return;
}

// 转换为C#接口实例
ILE440 instance = Marshal.GetTypedObjectForIUnknown(instancePtr, typeof(ILE440)) as ILE440;

// 调用成员方法
ushort virtualSlot = 0x01; // 替换为实际的插槽值
bool isOpened = instance.OpenLDevice(virtualSlot);
IntPtr moduleHandle = instance.GetModuleHandle();

步骤4:资源释放(关键)

C++创建的实例需通过库中导出的销毁函数释放,若库存在类似DestroyInstance的函数,需导入并调用:

[DllImport("lusbapi.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void DestroyInstance(IntPtr instance);

// 使用完成后释放资源
DestroyInstance(instancePtr);

内容的提问来源于stack exchange,提问作者Евгений Ильин

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:05:14