在 MFC/C++ 项目中使用 C# 库





5.00/5 (8投票s)
通过 C++/CLI 在 MFC/C++ 项目中使用 C# 库
代码托管在 Github。
本文旨在参考如何在 Visual Studio 2022 中通过 C++/CLI 在原生 C++ 项目中使用 .NET C# 库。即使您使用的是早期版本的 Visual Studio,也可以按照以下步骤操作,因为步骤基本相同。 它最初是为回答 CodeProject QnA 上的一个问题而编写的。 您的 C++ 项目不必是 MFC 即可按照此处描述的步骤进行操作; 它可以是控制台或其他类型,您可以忽略步骤 7,因为向 MFC 对话框添加按钮不适用于您的 C++ 项目类型。 注意:此示例不包括在 C++ UI 中托管 C# UI 元素; 这是一个复杂的话题。
为了简单起见,我们将在 C++ 项目中使用这个简单的 C# 类,它具有 Add
和 AddList
方法。
using System;
namespace CSharp
{
public class CSharpMath
{
public int Add(int a, int b)
{
return a + b;
}
public int AddList(List<int> arr)
{
int sum = 0;
foreach(int n in arr)
sum += n;
return sum;
}
}
}
步骤 1:通过在解决方案资源管理器中右键单击项目并选择属性来打开 MFC 项目的属性。
步骤 2:将显示“属性页”对话框。 启用 .NET CLR。 .NET Framework 版本必须与您的 C# 库相同。
步骤 3:通过右键单击“引用”节点并选择添加引用...,将对 C# 库的引用添加到 MFC 项目中。
选中您想要添加引用的 C# 项目。
步骤 4:接下来,我们将添加对 C# 项目的构建依赖项,以便每次构建 MFC/C++ 时,Visual Studio 会首先构建 C# 项目。
检查 C# 项目的构建依赖项。
步骤 5:通过在解决方案资源管理器中右键单击项目并选择属性来打开 MFC 项目的属性。 单击配置管理器...。 确保所有平台都相同。 C# 项目不能是 AnyCPU 配置:它必须是 x86 或 x64,与 C++ 项目设置匹配。 如果 x86 或 x64 不存在,则必须从 AnyCPU 设置创建它们。
步骤 6:关闭配置管理器。 接下来,我们将 /AI
开关添加到 C++ 编译器。 /AI
开关告诉 C++ 编译器在哪里可以找到您的 C# DLL。 您必须为 Debug x86、Debug x64、Release x86 和 Release x64 输入四个不同的路径。 这些路径可以是相对路径。 见下文。
- /AI"..\..\MFCwithCSharp\CSharpClass\bin\x86\Debug"
- /AI"..\..\MFCwithCSharp\CSharpClass\bin\x64\Debug"
- /AI"..\..\MFCwithCSharp\CSharpClass\bin\x86\Release"
- /AI"..\..\MFCwithCSharp\CSharpClass\bin\x64\Release"
步骤 7:最后一步是在 MFC 项目中添加两个名为 Add 和 Add List 的按钮。 双击 UI 设计器中的按钮,将为您创建一个空的按钮处理程序来调用您的 C# Add
或 AddList
方法。
步骤 8:在您将使用 C# 类的 cpp 文件中,添加 using
关键字来导入您的 C# DLL。 根据您的 DLL 名称修改 DLL 名称。
#using "CSharpClass.dll"
在我们的第一个按钮处理程序中,添加以下代码来调用 C# 类的 Add()
。 确保 C# 类类型以帽子 (^) 结尾,并使用 gcnew
来实例化您的 C# 类(不要使用 new
关键字,因为它保留用于在堆上实例化原生 C++ 对象)。 它会在消息框中显示加法结果。
void CMFCwithCSharpDlg::OnBnClickedBtnAdd()
{
CSharp::CSharpMath^ mathClass = gcnew CSharp::CSharpMath();
int result = mathClass->Add(2, 6);
char buf[200];
sprintf_s(buf, "Add result: %d", result);
MessageBoxA(GetSafeHwnd(), buf, "Add", MB_OK);
}
您可以使用 .NET 基类库 (BCL),例如 List
类。 在命名空间中将点替换为 ::
。 记住向 MFC 对话框添加另一个按钮来调用 AddList()
并将以下代码添加到该函数。
void CMFCwithCSharpDlg::OnBnClickedBtnAddList()
{
CSharp::CSharpMath^ mathClass = gcnew CSharp::CSharpMath();
System::Collections::Generic::List<int>^ myList =
gcnew System::Collections::Generic::List<int>();
myList->Add(1);
myList->Add(2);
myList->Add(3);
int result = mathClass->AddList(myList);
char buf[200];
sprintf_s(buf, "Add List result: %d", result);
MessageBoxA(GetSafeHwnd(), buf, "Add List", MB_OK);
}
构建您的 C++ 项目,C# 项目会自动首先构建,因为步骤 4 中设置了构建依赖项。 单击 Add 或 Add List 按钮。 确保它不会崩溃并且结果正确。 如果您在客户计算机上遇到“找不到 C# dll”的错误,则需要将 C# dll 复制到 C++ 可执行文件文件夹。
以上就是本示例的全部内容。 希望您可以在 C++ 项目中使用您的 C# 库。 您的下一步是掌握 C++/CLI。
历史
- 2023 年 4 月 12 日:将文章和源代码下载中的
AI
路径从绝对路径更新为相对路径。 感谢 tyjiang - 2023 年 4 月 8 日:首次发布