当前位置: 欣欣网 > 码农

在C#中调用C++ DLL(动态链接库)

2024-02-11码农

C# 和 C++ 是两种非常流行的编程语言,每种语言都有其独特的优势和适用场景。有时,我们可能需要在C#项目中调用C++编写的DLL(动态链接库)。这种跨语言调用可以通过平台调用(P/Invoke)或者C++/CLI等技术实现。本文将详细介绍如何在C#中调用C++ DLL。

步骤一:创建C++ DLL

首先,我们需要一个C++ DLL。以下是一个简单的C++ DLL示例,它包含一个名为 AddNumbers 的函数,该函数接收两个整数参数并返回它们的和。

C++ DLL代码(AddNumbers.cpp):

extern"C" __declspec(dllexport) intAddNumbers(int a, int b){
return a + b;
}

为了编译这个DLL,你需要一个C++编译器,如MSVC。将上述代码保存为 AddNumbers.cpp ,然后使用以下命令编译:

cl /LD AddNumbers.cpp

这将生成一个名为 AddNumbers.dll 的DLL文件。

步骤二:在C#中声明DLL函数

接下来,在C#项目中,我们需要声明一个与C++ DLL中函数签名匹配的委托。这允许C#代码调用DLL中的函数。

C#代码(Program.cs):

using System;
using System.Runtime.InteropServices;
classProgram {
// 声明与C++ DLL中函数签名匹配的委托
[DllImport("AddNumbers.dll", CallingConvention = CallingConvention.Cdecl)]
publicstaticexternintAddNumbers(int a, int b);
staticvoidMain() {
// 调用C++ DLL中的函数
int result = AddNumbers(23);
Console.WriteLine("The result is: " + result);
}
}

在上面的代码中, DllImport 属性告诉C#编译器从名为 AddNumbers.dll 的DLL中导入一个名为 AddNumbers 的函数。 CallingConvention.Cdecl 指定了C++函数的调用约定。

步骤三:编译和运行C#代码

最后,编译并运行C#代码。确保C#项目能够找到C++ DLL文件。你可以将DLL文件放在C#项目的输出目录中,或者将其路径添加到系统的PATH环境变量中。

编译并运行C#项目后,你应该能够在控制台上看到输出 The result is: 5 ,这是C++ DLL中 AddNumbers 函数返回的结果。

注意事项

  1. 名称修饰(Name Mangling): C++支持函数重载,因此编译器会为每个重载函数生成一个唯一的名称(通过名称修饰)。为了确保C#能够正确找到并调用C++函数,我们需要使用 extern "C" 来阻止C++编译器对函数名进行名称修饰。

  2. 调用约定(Calling Convention): C++和C#使用不同的调用约定。在上面的示例中,我们使用了 CallingConvention.Cdecl ,这是C++中最常见的调用约定之一。确保在C#和C++中使用相同的调用约定。

  3. DLL路径(DLL Path): 确保C#项目能够找到C++ DLL文件。你可以将DLL文件放在C#项目的输出目录中,或者将其路径添加到系统的PATH环境变量中。

通过这些步骤,你可以在C#中成功调用C++ DLL,实现跨语言编程。