簡體   English   中英

從C ++向C#的調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM