Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#Net调用MFC对话框?_C#_.net_Mfc_C++ Cli_Interop - Fatal编程技术网

从C#Net调用MFC对话框?

从C#Net调用MFC对话框?,c#,.net,mfc,c++-cli,interop,C#,.net,Mfc,C++ Cli,Interop,我需要将遗留MFC代码集成到我的C#.Net应用程序中 为了模拟MFC代码以简化集成,我创建了一个示例MFC对话框应用程序,其中有一个按钮和一个编辑框。当我点击按钮时,它会将Hello World写入编辑框 我的目标是使它可以从.Net应用程序调用。如果我的.Net应用程序能够弹出对话框,并在单击按钮时打印HelloWorld,我会很高兴。我听说C++/CLI是一种很好的方法。如果动态链接使事情复杂化,我也可以使用静态链接 首先,我想知道这是否可能?我不理解实现这一目标所需的过程 到目前为止:我

我需要将遗留MFC代码集成到我的C#.Net应用程序中

为了模拟MFC代码以简化集成,我创建了一个示例MFC对话框应用程序,其中有一个按钮和一个编辑框。当我点击按钮时,它会将Hello World写入编辑框

我的目标是使它可以从.Net应用程序调用。如果我的.Net应用程序能够弹出对话框,并在单击按钮时打印HelloWorld,我会很高兴。我听说C++/CLI是一种很好的方法。如果动态链接使事情复杂化,我也可以使用静态链接

首先,我想知道这是否可能?我不理解实现这一目标所需的过程

到目前为止:我从项目属性启用了CLR支持,并创建了一个C#WinForms应用程序。我能够添加MFC对话框应用程序作为对C#WInforms应用程序的引用。但是我一直在寻找如何通过接口导出对话框。既然我在做静态链接,我还需要为dialog类编写dllexports吗?我如何导出所有的dialog类,C#如何找到描述对话框GUI布局的资源文件

对话框的代码是应用程序向导生成的,我只是添加了一个编辑框和一个按钮,并为将HelloWorld写入编辑框的按钮添加了一个处理程序



首先,我尝试创建另一个MFC应用程序,看看是否至少可以从另一个MFC应用程序调用我的MFC对话框。在消费者应用程序中,我添加了我的Hello World对话应用程序作为参考,并包含了对话头文件的路径。但是它给了我一个错误,说IDD_DLG,我对话的ID是未知的。因此,我需要弄清楚如何提供资源文件,其中定义了所有ID。

MFC方法不能直接被p/调用(请参阅),我从另一个程序调用对话框所做的是创建一个包含对话框的DLL,导出一个可以调用对话框并从外部应用程序(例如:C#)调用DLL函数的函数:


您还可以根据需要添加参数以传递到对话框或从对话框传递出去…

MFC方法不能直接被p/调用(请参阅),我从另一个程序调用对话框所做的是创建包含对话框的DLL,导出可以调用对话框的函数,并从外部应用程序调用DLL函数(例如:C#):

您还可以根据需要添加参数以传递给/从对话框传递…

这里的关键字是COM互操作性:构建COM服务器(即ActiveX控件)以从托管代码调用非托管代码。我认为这是最好的方法。

这里的关键字是COM互操作性:构建COM服务器(即ActiveX控件)从托管代码调用非托管代码。在我看来,这是最好的方法

#include "stdafx.h"
#include "afxdialogex.h"
#include "MyDlg.h"

extern "C" __declspec (dllexport) BOOL ShowDlg()
{   AFX_MANAGE_STATE(AfxGetStaticModuleState());

    CMyDlg dlg;
    INT_PTR nResponse = dlg.DoModal();
    return (nResponse == IDOK);
}