从 C++ 向后调用到 C#
本文关键字:调用 C++ | 更新日期: 2023-09-27 18:32:03
我正在使用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 异常,而不进行任何堆栈跟踪。而且我已经失去了理智,试图搜索导致这种情况的原因。有趣的是,这在我们的大型应用程序中不起作用(即使我试图关闭所有应用程序,只是在启动时调用它),但在我的小型测试应用程序上它可以工作。
任何帮助,不胜感激。
您可以使用
.Net CLI C++包装器,然后调用标准C++代码。