创建一个C#DLL并从非托管C++中使用它

Mr.*_*Boy 14 c# c++ interop export dllexport

我有一个本机(非托管)C++应用程序(使用wxWidgets来实现它的价值).我正在考虑用C#编写一个单独的工具应用程序,其中包含基于winform的对话框.将一些对话框放在一个单独的DLL中会很有用,因为我希望能够在我的C++应用程序中使用它们.

但是我不知道要实现这个目标需要多少麻烦,这是否特别容易?

编辑:

我不需要直接调用对话框函数.我只需要一种方法让我的C++应用程序调用C#DLL中的API来传递数据,以及C#DLL在C++应用程序中调用某种观察者/后退对象上的方法的方法.

例如来自C++:

CSharpManager *pCSM = SomehowGetPointerToCSharpObject();
CSharpObserver pCSO = new CSharpObserver;

pCSM->RegisterCPlusPlusObserver(pCSO);
pCSM->LaunchDialog();
Run Code Online (Sandbox Code Playgroud)

当用户在C#对话框中执行操作时,将调用pCSO方法将数据传递回C++

因此,我认为这几乎是一个原始的C++/C#通信问题.但是虽然我知道C++和C#但我不知道.net本身是如何工作的.我知道COM,但我真的宁愿避免它,我怀疑我工作的任何其他开发人员都知道它.

Han*_*ant 7

非托管代码中互操作的通用语言是COM.这很容易在C#端进行,只需使用[ComVisible] 属性.您需要在C++程序中编写COM代码才能使用它,如果您从未这样做过,那么就不会那么容易.如果使用MSVC编译器,请从#import指令开始.

您的下一个选择是自己在非托管代码中托管CLR,而不是依赖COM互操作层来处理它.它允许您直接创建托管类型.这也需要COM,但只能加载和初始化CLR. 该项目展示了这种方法.

  • @Ben:请在这个帖子中发表您自己帖子中的示例代码,我无法理解您的意见.托管程序集包含数据,而不是代码.IL和元数据.您可以使用C++/CLI编译器生成带有DLL导出的thunk,这是我所知道的唯一技巧.导出课程,特别是C#课程还有很长的路要走. (2认同)

小智 1

这取决于您所说的“我希望能够从我的 C++ 应用程序中使用它们”的意思。

在本机世界中,对话框具有对话框模板结构,您可以将其“烹饪”到可执行文件中,无论是 DLL 还是 EXE。美好的。但在管理世界中,情况有些不同。Winforms 应用程序没有“对话框模板”资源类型。相反,表单只是代码。

然而:

  • 您始终可以从非托管代码调用托管 DLL。这是微不足道的。该托管 DLL 可以显示您的 Winforms 对话框。因此应用程序的本机 C++ 部分可以调用这些对话框。但如果没有一些额外的工作,它无法直接实例化它们。

  • 您始终可以在本机 C++ 代码和托管 DLL 之间插入 C++/CLI“shim DLL”。在 C++/CLI 中,您可以透明地加载托管资源/对话框和 .NET 资源/对话框。

  • 就此而言,您可以直接从本机代码调用 .NET 方法,无需中间 C++/CLI shim DLL,尽管这有点混乱。

但至于直接使用“.NET/Winforms对话框资源”……不行。不是指对 Winform 和本机 C++ 使用相同的对话框模板。