[英]Passing a C# delegate to a C++/CLI wrapper
我按照這個例子使用ac#delegate作為c ++回調。
我的包裝器看起來像這樣:
// GLFWWrapper.h
#pragma once
using namespace System;
namespace GLFWWrapper {
typedef void(__stdcall *KEY_CALLBACK)(int, int, int, int);
public ref class Window {
public:
void setKeyCallback(KEY_CALLBACK fp);
static KEY_CALLBACK csharpKeyCallback;
...
};
}
// GLFWWrapper.cpp
#include "stdafx.h"
#include "GLFWWrapper.h"
namespace GLFWWrapper {
void cppKeyCallback(GLFWwindow * window, int key, int scancode, int action, int mods) {
if (Window::csharpKeyCallback) {
Window::csharpKeyCallback(key, scancode, action, mods);
}
}
void Window::setKeyCallback(KEY_CALLBACK fp) {
csharpKeyCallback = fp;
}
...
}
cppKeyCallback
函數是我在另一個函數中設置的回調( glfwSetKeyCallback(m_ptr, cppKeyCallback);
)。 csharpKeyCallback
應該是我的C#項目的委托。 在上面鏈接的示例中,我只解釋了如何從包裝器中設置委托。 但是如何從C#項目中設置委托? 當我嘗試從我的C#項目調用setKeyCallback
,我得到一個錯誤。 Window.setKeyCallback(?) is not supported by the language
setKeyCallback
Window.setKeyCallback(?) is not supported by the language
。
您似乎錯過了指令的托管部分:
#pragma managed
public delegate void keyCallback(int, int, int, int);
void Window::setKeyCallback(keyCallback^ fp) {
csharpKeyCallback = fp;
}
為了將對函數實例(委托)的引用從C#傳遞給C ++ \\ CLI,您需要聲明它,即聲明一個托管委托。 這可以在C#或C ++ \\ CLI中完成。
在您的代碼中,KEY_CALLBACK是一個非托管函數聲明。 因此它“不受語言支持”。 C#端不能將它用作委托聲明。
為了避免這種混亂,我自己始終保持我的C ++ \\ CLI項目不受任何托管聲明的影響,並在C ++ \\ CLI包裝器和C#端引用的附加C#類庫中提供這些。
編輯:不要忘記在托管方法聲明中將管理引用類型之后的^符號放置,否則編譯器將會出現錯誤“ 此處不允許委托類型 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.