1

我正在使用 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 异常,而没有任何堆栈跟踪。我已经失去了理智,试图寻找造成这种情况的原因。有趣的是,这在我们的大型应用程序中不起作用(即使我尝试关闭所有功能,并在启动时调用它),但在我的小型测试应用程序中它可以工作。

任何帮助表示赞赏。

4

1 回答 1

1

您可以使用 .Net CLI C++ 包装器,然后调用您的标准 C++ 代码。

于 2012-04-23T12:02:36.827 回答