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,但我真的宁愿避免它,我怀疑我工作的任何其他开发人员都知道它.
非托管代码中互操作的通用语言是COM.这很容易在C#端进行,只需使用[ComVisible
] 属性.您需要在C++程序中编写COM代码才能使用它,如果您从未这样做过,那么就不会那么容易.如果使用MSVC编译器,请从#import指令开始.
您的下一个选择是自己在非托管代码中托管CLR,而不是依赖COM互操作层来处理它.它允许您直接创建托管类型.这也需要COM,但只能加载和初始化CLR. 该项目展示了这种方法.
小智 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++ 使用相同的对话框模板。
归档时间: |
|
查看次数: |
6008 次 |
最近记录: |