将 C# 委托传递给 C++/CLI 包装器
Passing a C# delegate to a C++/CLI wrapper
>我按照此示例使用 c# 委托作为 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
。
您似乎缺少指令的托管部分:
#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# 类库中提供这些声明。
编辑:不要忘记在托管方法声明中的托管引用类型之后放置^符号,否则编译器会破坏您并显示错误"此处不允许委托类型"。
相关文章:
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- VS2010 C++ 调试托管 (C++/CLI) DLL
- 如何将 C++/CLI 库链接到C++应用程序
- C++/CLI targetting .NET Core 3.1
- 模板函数签名在 C++/CLI 中解包
- C++/CLI 混合托管/本机 DLL 不起作用
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- DirectX 12 和 C++ CLI :无法使用IID_PPV_ARGS
- 如何为要在 C# 中使用的静态库创建 C++ 或 C++/CLI 包装器
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- C++/CLI -- 访问结构成员
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 如何将CLI类的函数指针作为参数传递给C++方法
- 用于LabView中使用的本机c++的c++/cli dll包装器
- C#WPF和C++/CLI以及C++在C++/CLI中添加外部库错误
- 在.NET Core 3.1中运行托管C++/CLI程序集时,映像格式错误