私は、C#デリゲートをC++コールバックとして使用する例として、thisをフォローしていました。C#デリゲートをC++/CLIラッパーに渡す
私のラッパーは、次のようになります。
// 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#プロジェクトからデリゲートを設定するにはどうすればよいですか? setKeyCallback
を私のC#プロジェクトから呼び出そうとすると、エラーWindow.setKeyCallback(?) is not supported by the language
が発生します。あなたはそれがすなわち宣言宣言する必要がC++ \ CLIのC#から関数インスタンス(デリゲート)への参照を渡すために
#pragma managed
public delegate void keyCallback(int, int, int, int);
void Window::setKeyCallback(keyCallback^ fp) {
csharpKeyCallback = fp;
}
:あなたは命令の管理一部が欠けているように見える
setKeyCallback関数のkeyCallbackに「代理型がここで許可されていません」というエラーが表示されます。 – gartenriese
@gartenrieseメソッド宣言で管理された参照インジケータ - '^'を指定するのを忘れていました。メソッド宣言は次のようになります。 void Window :: setKeyCallback(keyCallback^fp); この記号 '^'は、マネージタイプkeyCallbackのインスタンスにマネージリファレンスを渡すことを定義しています。 –