2016-04-22 41 views
1

私は、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; 
} 

:あなたは命令の管理一部が欠けているように見える

答えて

2

管理された代理人。これは、C#またはC++ \ CLIで行うことができます。

コードでは、KEY_CALLBACKはアンマネージ関数の宣言です。したがって、それは「言語によってサポートされていません」です。 C#側はそれをデリゲート宣言として使用できません。

私は自分のC++ \ CLIプロジェクトを常に管理された宣言から解放し、C++ \ CLIラッパーとC#側の両方から参照される追加のC#クラスライブラリにそれらを提供します。

編集:管理メソッド宣言またはコンパイラで管理参照型がエラーであなたをバストしようとされた後^看板を置くことを忘れてはいけない「​​デリゲート型は、ここで許可されていません」。

+0

setKeyCallback関数のkeyCallbackに「代理型がここで許可されていません」というエラーが表示されます。 – gartenriese

+0

@gartenrieseメソッド宣言で管理された参照インジケータ - '^'を指定するのを忘れていました。メソッド宣言は次のようになります。 void Window :: setKeyCallback(keyCallback^fp); この記号 '^'は、マネージタイプkeyCallbackのインスタンスにマネージリファレンスを渡すことを定義しています。 –