簡體   English   中英

將 C++ 函數指針傳遞給帶有嵌入式單聲道的 C#

[英]Pass a C++ function pointer to C# with embedded mono

我有一個 C# 方法,如下所示:

public delegate void VariableObserver(string variableName, object newValue);

public void ObserveVariable(string variableName, VariableObserver observer)
{
    // stuff
}

這段代碼被嵌入到一個 C++ 應用程序中,我想從 C++ 調用ObserveVariable函數,傳遞一個函數指針或與VariableObserver委托等效的東西。 目的是 C# 代碼可以調用委托,並且 C++ 函數將被調用。

我習慣於使用mono_runtime_invoke來調用 C# 函數,而且效果很好。 但是,我找不到任何有用的文檔示例,說明如何傳遞函數指針/委托。 您是否需要像處理字符串等類型一樣將其裝箱? 如果是這樣,你怎么做? 甚至有可能嗎?

我在四處搜索時發現了Marshal.GetDelegateFromFunctionPointer方法,我想我可以在 C# 中使用它來獲取 delgate 並照常進行,但是這些文檔說這現在已經過時了。

編輯:我發現了更多的東西。 有一個較新的 Marshal 函數: Marshal.GetDelegateForFunctionPointer<TDelegate>(IntPtr)看起來很有希望,但它明確表示“不能將此方法用於通過 C++ 或從 GetFunctionPointer 方法獲得的函數指針。” :(

Edit2:我已經嘗試過只使用 GetDelegateForFunctionPointer 的建議,但看起來函數指針沒有正確編組。 看一看:

C#代碼:

delegate void TestObserver(int num);

public void BindObserver(IntPtr observerFuncPtr)
{
    TestObserver obs = Marshal.GetDelegateForFunctionPointer<TestObserver>(observerFuncPtr);
    obs(1337);
}

C++代碼:

static void ObserverCallback(int num)
{
    printf("WE GOT A CALLBACK %d", num);
}

// inside a function I call

void* params[1];
params[0] = &ObserverCallback;

MonoObject* exception;
mono_runtime_invoke(theMonoMethod, theMonoInstance, params, &exception);

但是,這樣做會導致 C# 出現此錯誤:

Runtime Exception : System.NullReferenceException: Object reference not set to an instance of an object
  at (wrapper managed-to-native) System.Object:wrapper_native_8348575608244C89 (int)
  at InkGlue.GlueStory.BindObserver (System.IntPtr observerFuncPtr) [0x00006] in <78fcd644f8db43978f6f7b1655d0ab2f>:0 

這讓我相信函數指針沒有成功傳遞給 C#。 有關如何正確執行此操作的任何信息?

簡單的解決方法是 C 墊片。 https://stackoverflow.com/a/31232805/179795以及該問題中的其他答案也可能有所幫助。

我認為Marshal.GetDelegateForFunctionPointer會起作用,如果你將一個標記為static的函數的地址傳遞給它。 如有必要, this作為顯式參數傳遞。

暫無
暫無

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

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