- 准备工作
首先,确保你会C#开发,并且已经安装好了Visual Studio。其次,我们需要准备一个C语言的dll,作为我们的示例,我们将使用以下的代码:
#include <stdio.h>
int add_numbers(int a, int b)
{
return a + b;
}
保存以上代码到一个add_numbers.c
的文件中。接下来,我们需要使用gcc编译器编译这个文件并生成动态链接库:
gcc -shared -o add_numbers.dll add_numbers.c
如果一切顺利的话,我们应该可以在当前目录下找到一个名叫add_numbers.dll
的文件。
- 创建C#项目
现在,我们需要在Visual Studio中创建一个新的C#项目。在新建的项目中,我们需要使用DllImport特性来调用我们的C语言DLL。以下是一个示例代码:
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("add_numbers.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int add_numbers(int a, int b);
static void Main(string[] args)
{
Console.WriteLine("5 + 7 = " + add_numbers(5, 7));
}
}
在上面的代码中,我们使用了DllImport特性来声明我们要调用的外部函数,也就是add_numbers
。其中,add_numbers.dll
是我们要调用的DLL文件名(请根据情况更改文件名),CallingConvention
参数指定了调用约定,这里我们使用了C语言默认的调用约定Cdecl。
- 运行代码
现在,我们可以运行我们的C#程序了。如果一切顺利,我们应该可以看到输出结果5 + 7 = 12
。
- 第二个示例
我们再来看看另外一个实例。以下是一个C语言函数,它对输入的字符串进行了简单的加密。
#include <stdio.h>
#include <string.h>
void encrypt(char* str, int key)
{
int len = strlen(str);
int i;
for (i = 0; i < len; i++)
{
str[i] = str[i] + key;
}
}
我们使用与上一个示例相同的编译命令来生成encrypt.dll
库文件。
现在,我们可以使用以下的C#代码来调用该函数。
using System;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
[DllImport("encrypt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void encrypt(IntPtr str, int key);
static void Main(string[] args)
{
string input = "hello";
byte[] bytes = Encoding.ASCII.GetBytes(input);
IntPtr str = Marshal.AllocHGlobal(bytes.Length + 1);
Marshal.Copy(bytes, 0, str, bytes.Length);
Marshal.WriteByte(str, bytes.Length, 0);
encrypt(str, 5);
string result = Marshal.PtrToStringAnsi(str);
Console.WriteLine(result);
Marshal.FreeHGlobal(str);
}
}
在上面的代码中,我们使用了IntPtr
类型来表示指向字符串的指针,同时我们需要手动托管内存,因为外部函数(在此为encrypt
)不能直接操作C#中的字符串。
注意:由于我们是托管了指针,因此需要手动释放内存来防止内存泄漏。在这里,我们使用了Marshal.FreeHGlobal
方法来释放托管的内存。
- 总结
使用C#调用C语言的DLL并没有太多的技术细节,但是需要我们注意一些注意事项,例如,在使用指针时要小心内存管理。最后,我们应该测试我们的代码确保它可以正确执行,并且没有造成不可预期的错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:windows中使用C# 调用 C语言生成的dll - Python技术站