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库用到的一些细节。

  1. 在类里写函数需要像Main函数一样加static声明。
  2. 把库函数声明写到一个类里,并加上[DllImport(@"libmath.dll")]public static extern声明,后续函数通过类调用。
  3. 把C库放到可执行程序路径下。
  4. 可以使用byte[]代替unsigned char *,类似的指针类的参数都转换为数组。
  5. 可以使用Array.Copy(src, des, len);代替memory(des, src, len)
  6. 二维数组与一维数组。
//当作有10个64字节一维数组的二维数组
byte[] src = new byte[10*64];
byte[] des = new byte[64];

//源、源起始、目标、目标起始、拷贝长度
Array.Copy(src, 2*64, des, 0, 64);
  1. 分配空间不需要手动释放
  2. while(1)要写成while(true)