我有一个要在 C# 中使用的 C++ 类。为此,我正在尝试编写另一个 C++ dll 来用可调用函数(使用“extern C 和 __declspec(dllexport)”)包装这个类(它是另一个库的一部分)。我的想法是保留一个指向我的对象的指针并将其发送到包装 dll 中的函数,然后从那里调用该对象的方法。这看起来很好,但是当对象具有解构函数时会出现问题。
这是我的 C++ 包装器代码:(设备是我的 C++ 类/对象)
__declspec(dllexport) Status Device_open(Device* di, const char* uri)
{
Device dl;
Status status = dl.open(uri);
di = &dl;
return status;
}
__declspec(dllexport) void Device_Close(Device* di)
{
di->close();
}
这是我的 C# 包装器代码:
[DllImport("Wrapper.dll")]
static extern Status Device_open(ref IntPtr objectHandler, IntPtr uri);
public static Device Open(string uri)
{
IntPtr handle = IntPtr.Zero;
Device_open(ref handle, Marshal.StringToHGlobalAnsi(uri));
return new Device(handle);
}
[DllImport("Wrapper.dll")]
static extern void Device_Close(IntPtr objectHandler);
public void Close()
{
Device_Close(this.Handle);
}
这是 C# 应用程序中的测试代码:
Device d = Device.Open(di.URI);
d.Close();
一切都是好的。问题就在这里,当我请求打开一个新设备时,主 C++ 对象的解构器将被执行,所以我的关闭请求总是返回异常(因为它已经关闭或被破坏);
我能做些什么来防止这种情况发生?!