我正在尝试编写一个使用C ++ DLL的基于C#的WPF应用程序。 C#应用程序用于用户界面,它具有WPF的所有优点。 C ++ DLL使用Win32函数(例如枚举窗口)。
现在我希望C ++ DLL引发可以在C#应用程序中处理的事件。这就是我尝试过的(基于this article):
//cpp file
#using <System.dll>
using namespace System;
struct WIN {
HWND Handle;
char ClassName;
char Title;
};
delegate void wDel(WIN);
event wDel^ wE;
void GotWindow(WIN Window) {
wE(Window);
}
当我尝试编译此代码时,会抛出这些错误:
C3708:'wDel':'事件'使用不当;必须是兼容事件源的成员
C2059:语法错误:'event'
C3861:'wE':找不到标识符
答案 0 :(得分:0)
您的事件需要是某个托管类的成员,可能是静态的。 e.g:
#include "stdafx.h"
#include "windows.h"
using namespace System;
struct WIN {
HWND Handle;
char ClassName;
char Title;
};
delegate void wDel(WIN);
ref class WindowEvents abstract sealed // abstract sealed ref class in c++/cli is like a static class in c#
{
public:
static event wDel^ wE;
static void GotWindow(WIN Window) {
wE(Window);
}
};
<强>更新强>
如果您需要convert your unmanaged HWND
to an IntPtr
,因为IntPtr
是standard P/Invoke signature for an HWND in c#,您可能会考虑以下内容:
#include "stdafx.h"
#include "windows.h"
using namespace System;
#pragma managed(push,off)
struct WIN { // Unmanaged c++ struct encapsulating the unmanaged data.
HWND Handle;
char ClassName;
char Title;
};
#pragma managed(pop)
public value struct ManagedWIN // Managed c++/CLI translation of the above.
{
public:
IntPtr Handle; // Wrapper for an HWND
char ClassName;
char Title;
ManagedWIN(const WIN win) : Handle(win.Handle), ClassName(win.ClassName), Title(win.Title)
{
}
};
public delegate void wDel(ManagedWIN);
public ref class WindowEvents abstract sealed // abstract sealed ref class in c++/cli is like a static class in c#
{
public:
static event wDel^ wE;
internal:
static void GotWindow(WIN Window) {
wE(ManagedWIN(Window));
}
};
此处ManagedWIN
仅包含安全的.Net类型。