从 C++ 向后调用到 C#

A call backwards from C++ to C#

本文关键字:调用 C++      更新时间:2023-10-16

我正在使用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++代码。