[英]A call backwards from C++ to C#
我從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 ++代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.