![](/img/trans.png)
[英]What is a way to provide logging from a c++ dll to a c# application via interop/pinvoke
[英]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.