C# 调用 C 动态库
使用C#程序模版
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
/* 我的第一个 C# 程序*/
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}
添加命名空间
using System.Runtime.InteropServices;
添加调用声明
在命名空间ConsoleApplication1
中添加一个类,用于声明待调用的外部的C
库函数
class MathCall
{
[DllImport(@"libmath.dll")]
public static extern int sub(int a, int b);
}
添加调用
在Main
函数中通过引用类成员的方法来调用函数
int n = MathCall.sub(9,1);
编译
使用Visual Studio
的命令提示工具环境,编译语句如下:
//编译64位
csc.exe helloworld.cs
//编译32位
csc.exe /platform:x86 helloworld.cs
要注意的地方
并不是用C#为开发语言,写C#的目的也是为例演示如何调用自己的C库,因此这里不说明C#语法,只是记录与C/C++差异与调用C库用到的一些细节。
- 在类里写函数需要像
Main
函数一样加static
声明。 - 把库函数声明写到一个类里,并加上
[DllImport(@"libmath.dll")]
和public static extern
声明,后续函数通过类调用。 - 把C库放到可执行程序路径下。
- 可以使用
byte[]
代替unsigned char *
,类似的指针类的参数都转换为数组。 - 可以使用
Array.Copy(src, des, len);
代替memory(des, src, len)
。 - 二维数组与一维数组。
//当作有10个64字节一维数组的二维数组
byte[] src = new byte[10*64];
byte[] des = new byte[64];
//源、源起始、目标、目标起始、拷贝长度
Array.Copy(src, 2*64, des, 0, 64);
- 分配空间不需要手动释放
- while(1)要写成while(true)