gpt4 book ai didi

c# - 从托管 C# 回调非托管代码

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:57 25 4
gpt4 key购买 nike

这里有点历史课。我正在处理遗留 C++/MFC 应用程序,并试图通过推送用 C#(WinForms 和后来的 WPF)编写的组件来开始增量现代化。

我坚持使用 .Net/1.1 和 VS/2003 的原因有很多,在不久的将来无法解决。

目前,作为概念证明,类似这样的方法可行:

#pragma push_macro("new")
#undef new

WinFormA::Form1* myform;
myform = __gc new WinFormA::Form1();
myform->ShowDialog();

#pragma pop_macro("new")

我遇到的问题是 - 我需要非托管 C++/MFC 代码将回调指针传递到托管 C# WinForm 代码中,以便我可以捕获用户交互并让应用程序处理它们。

我看过一些文章,例如 this MSDN article但它在 VS/2003 中不起作用(编译器不喜欢委托(delegate)语法)。

还有其他选择吗?我不认为我可以使用 DLLImport,因为我需要与特定应用程序实例而不是平面 API 进行交互。

谢谢!

最佳答案

如果其他答案没有解决,您总是可以编写一个 C 包装器来扁平化类。例如,如果 C++ 类是:

class TheClass {
public:
TheClass(int Param);
~TheClass();

bool SomeFunction(int Param1,int Param2);
};

我会写一个包装器:

extern "C" void *TheClass_Create(int Param) {
return (void*) new TheClass(Param);
}

extern "C" void TheClass_Destroy(void *This) {
delete (TheClass*) This;
}

extern "C" bool TheClass_SomeFunction(void *This,int Param1,int Param2) {
return ((TheClass*) This)->SomeFunction(Param1,Param2);
}

因为包装器是纯 C 语言,所以您可以在 C# 中随心所欲地进行 P/Invoke(void *This 应该变成一个 IntPtr 以确保在您迁移到 64 位时的兼容性)。有时,如果我真的雄心勃勃,我实际上会围绕 P/Invoke 编写一个 C# 包装器来“重新分类”这个东西。

关于c# - 从托管 C# 回调非托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com