簡體   English   中英

有沒有辦法讓 C# 應用程序使用 C++ DLL 提供一個以字符串為參數的回調函數?

[英]Is there a way for a C# application using a C++ DLL to provide a callback function which takes a String as an argument?

因此,我正在嘗試使用 P/Invoke 編寫我的第一個程序,以圍繞 c++ 庫創建一個包裝器,以允許在 ac# 應用程序中使用。 該庫的功能之一是它需要一個回調函數(委托),其簽名為void callback_func(string log, int time)

我正在嘗試確定如何包裝它,以便 C# 庫可以處理 c++ 庫傳遞給此函數的 std::strings。

我試着看看這個從 C# 到 C++ DLL 的傳遞字符串並返回 - 最小的例子,但是我無法確定這將如何應用在這個上下文中,其中一個委托被提供給庫。

委托函數如下:

C# 應用程序

public delegate void log_delegate(string log, int time);
static void logFunc(string log, int time)
{
    Console.WriteLine($"{log} {time}");
}

並將它作為對象 Foo 的構造函數中的參數傳遞給 C++ 庫,該對象具有將調用此函數的成員函數

C# 應用程序

    log_delegate my_del = logFunc;
    IntPtr foo = Foo_Create(6, 6, my_del);

C++ 庫當前調用回調函數,將相關的日志信息作為字符串傳遞到第一個參數中。

目前,我只是返回垃圾值,(即“►>üv⌂☻”)

每次從 C# 到 C++ 並返回時,您應該記住有不同的內存管理器。 這意味着您每次越過邊界時都會復制字符串。 而且您需要一個 C++/CLI 包裝器庫,它可以作為世界之間的翻譯器(添加一個單獨的項目,它可以引用 .NET 和 C++ 類)。 在 lib 中,您需要這樣的代碼:

void logFuncBridge(wchar_t *strCpp, int time) // called by C++
{
    String^ strDotnet = gcnew String(strCpp);
    logFunc(strDotnet, time); // invokes C#
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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