65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2023年4月8日

MIT

3分钟阅读

viewsIcon

14109

downloadIcon

334

通过 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# 类,它具有 AddAddList 方法。

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 项目的属性。

Project Properties

步骤 2:将显示“属性页”对话框。 启用 .NET CLR。 .NET Framework 版本必须与您的 C# 库相同。

Enable CLR

步骤 3:通过右键单击“引用”节点并选择添加引用...,将对 C# 库的引用添加到 MFC 项目中。

Add reference by right-clicking on project

选中您想要添加引用的 C# 项目。

Check the CSharp library reference

步骤 4:接下来,我们将添加对 C# 项目的构建依赖项,以便每次构建 MFC/C++ 时,Visual Studio 会首先构建 C# 项目。

Right-licking on a project dependency

检查 C# 项目的构建依赖项。

Check the CSharp library project as build dependency

步骤 5:通过在解决方案资源管理器中右键单击项目并选择属性来打开 MFC 项目的属性。 单击配置管理器...。 确保所有平台都相同。 C# 项目不能是 AnyCPU 配置:它必须是 x86 或 x64,与 C++ 项目设置匹配。 如果 x86 或 x64 不存在,则必须从 AnyCPU 设置创建它们。

How to set configuration manager

步骤 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 项目中添加两个名为 AddAdd List 的按钮。 双击 UI 设计器中的按钮,将为您创建一个空的按钮处理程序来调用您的 C# AddAddList 方法。

Add a button to the dialog

步骤 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 中设置了构建依赖项。 单击 AddAdd List 按钮。 确保它不会崩溃并且结果正确。 如果您在客户计算机上遇到“找不到 C# dll”的错误,则需要将 C# dll 复制到 C++ 可执行文件文件夹。

以上就是本示例的全部内容。 希望您可以在 C++ 项目中使用您的 C# 库。 您的下一步是掌握 C++/CLI。

历史

  • 2023 年 4 月 12 日:将文章和源代码下载中的 AI 路径从绝对路径更新为相对路径。 感谢 tyjiang
  • 2023 年 4 月 8 日:首次发布
© . All rights reserved.