C#与C++是两种不同的编程语言,但C#调用C++ DLL是一个非常常见的需求。下面就是调用C++ DLL的步骤:
步骤一:编写C++ DLL
首先,需要编写C++的DLL。以下是一个简单的例子:
// ExampleDLL.cpp
#ifdef EXAMPLEDLL_EXPORTS
#define EXAMPLEDLL_API __declspec(dllexport)
#else
#define EXAMPLEDLL_API __declspec(dllimport)
#endif
EXAMPLEDLL_API int AddTwoNumbers(int a, int b)
{
return a + b;
}
上述代码实现了一个简单的方法AddTwoNumbers,将传入的两个数相加并返回。
步骤二:使用C#访问C++ DLL
接下来,我们需要在C#中使用C++的DLL。 C#中使用DllImport属性访问DLL。
// ExampleCSharp.cs
using System.Runtime.InteropServices;
public class ExampleCSharp
{
[DllImport("ExampleDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int AddTwoNumbers(int a, int b);
}
解释一下这个类的代码。 首先,它使用DllImport属性来指定要访问的DLL(在这个例子中是ExampleDLL.dll)。 CallingConvention属性告诉C# DLL是使用哪种调用约定(在这个例子中,我们使用的是Cdecl调用约定)。
接下来,我们声明了一个AddTwoNumbers函数。 此函数使用extern关键字声明为外部函数,其返回类型为Int并接受两个Int参数。
示例一:在C#中调用C++函数
现在我们已经准备好了C++ DLL和C#代码,让我们看一下如何在C#中调用C++函数。 创建一个控制台应用程序项目,然后添加ExampleCSharp.cs文件,并将以下代码添加到Main函数中:
static void Main(string[] args)
{
int result = ExampleCSharp.AddTwoNumbers(5, 8);
Console.WriteLine(result);
Console.ReadLine();
}
这就是你需要的所有代码,当你运行它时,将打印出5和8的总和13。
示例二:字符串传递
大多数情况下我们不仅需要传递整型参数,还需要传递字符串参数,以下代码演示了如何在C#中传递字符串参数并在C++ DLL中使用它。
C++ DLL中的函数将读取字符串并返回一个新的字符串。
// ExampleDLL.cpp
#ifdef EXAMPLEDLL_EXPORTS
#define EXAMPLEDLL_API __declspec(dllexport)
#else
#define EXAMPLEDLL_API __declspec(dllimport)
#endif
#include <string>
#include <iostream>
EXAMPLEDLL_API std::string ReverseString(std::string str)
{
std::string result;
for (int i = str.size() - 1; i >= 0; i--)
{
result += str[i];
}
return result;
}
我们使用C#编写一个控制台应用程序,调用C++的ReverseString方法,并将一个字符串传递给它。
// ExampleCSharp.cs
using System.Runtime.InteropServices;
public class ExampleCSharp
{
[DllImport("ExampleDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern string ReverseString(string str);
}
static void Main(string[] args)
{
string result = ExampleCSharp.ReverseString("Hello World!");
Console.WriteLine(result);
Console.ReadLine();
}
当你运行这个C#程序时你会发现一个奇怪的问题。 奇怪的地方在于传入C++函数的字符串和从C++函数返回的字符串不同。 这是因为C++和C# both have their own Unicode encodings, and there is a conversion that happens when passing strings between them.
To fix this, you need to explicitly declare the string as Unicode when passing it to the C++ function.将C#程序更改为以下代码:
// ExampleCSharp.cs
using System;
using System.Runtime.InteropServices;
using System.Text;
public class ExampleCSharp
{
[DllImport("ExampleDLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern string ReverseString([MarshalAs(UnmanagedType.LPWStr)]string str);
}
static void Main(string[] args)
{
string result = ExampleCSharp.ReverseString("Hello World!");
Console.WriteLine(result);
Console.ReadLine();
}
此代码使用CharSet = CharSet.Unicode指定字符串数据将是Unicode,并使用MarshalAs属性指定数据传递方式。 然后您可以成功调用DLL,它将返回“!dlroW olleH”作为结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#调用C++dll方法步骤 - Python技术站