簡體   English   中英

將C#委托傳遞給C ++ / CLI包裝器

[英]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.

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