我正在使用 C# 中的 C++ 库,该库还没有完全开发用于从其他语言中使用,但现在很难改变一些东西。我正在使用 [DllImport] 调用,几乎一切正常。
但知道我需要使用从 C++ 到 C# 的“向后”调用。因此,在 C# 中,我需要订阅 C++ 函数。在 C++ 中,它是这样实现的:
INTF_API void __stdcall Intf_InstallHandler(Intf_MailHdlPtrType Hdl)
typedef void (STDCALL *Intf_MailHdlPtrType)(InstanceNoType instno,
const MailType* mail, rsuint16 mailsize);
(我从方法中删除了一些参数以使其更简单。它们是两个字节 - 不重要)所以在 C# 中我有:
public delegate void MailEventHandler(byte Instance, MailType Mail, UInt16 MailLength);
MailHandlerDef defHandler = (f) =>
{
var structure =
(MailType)Marshal.PtrToStructure(f, typeof(MailType));
handler(structure);
};
Externs.Intf_InstallMailHandler(defHandler);
[DllImport(DLL_NAME, CallingConvention = CallingConvention.StdCall)]
public static extern void Intf_InstallMailHandler(byte Instance, [MarshalAs(UnmanagedType.FunctionPtr)] MailHandlerDef MailHandler, PrimitiveType Primitive);
我们有不同的原语(在 C++ dll 中,每个方法都是一个原语,每个方法都实现为调用和等待方法,或者作为异步方法,在计算结束时调用 mailHandler),并且所有原语都有效,除了一个。
如果调用此原语,则会抛出 NullRef 异常,而没有任何堆栈跟踪。我已经失去了理智,试图寻找造成这种情况的原因。有趣的是,这在我们的大型应用程序中不起作用(即使我尝试关闭所有功能,并在启动时调用它),但在我的小型测试应用程序中它可以工作。
任何帮助表示赞赏。