Windows下C#调用C语言编译的DLL

Ivy
Ivy
发布时间:2026-10-13 | 5人浏览过
原创

本文详细讲解如何在Windows系统中将C语言源码编译为动态链接库(DLL),并在C#项目中通过P/Invoke技术安全调用该DLL中的函数。

实现目标

本教程的最终目标是演示一个完整的跨语言交互流程:首先使用GCC工具链将C语言编写的简单交换逻辑编译为Windows平台的DLL文件;接着创建一个C#控制台应用程序,利用运行时库(Runtime.InteropServices)提供的机制导入外部函数;最后执行该程序以验证内存值交换是否正确完成。

准备条件

  1. C语言编译器:推荐使用 mingw64(GNU Compiler Collection 的 MinGW 版本)。注意:请勿使用 Cygwin 生成的 GCC,因其 ABI 兼容性与 Windows原生环境存在差异。
  2. 开发环境:已安装 Visual Studio 或 .NET SDK。
  3. 基础认知:了解基本的 C 语法指针操作及 C# 的安全上下文概念。

操作步骤

第一步:编写C语言源文件并建立项目结构

目的:创建需要被调用的底层函数逻辑。

  • 入口:任意文本编辑器或IDE。
  • 动作:新建一个名为 test.c 的文件。
  • 代码内容:定义一个简单的整数交换函数。
void swap(int* a, int* b){
 int c = *a;
 *a = *b;
 *b = c;
}

第二步:使用 MinGW64 编译生成 DLL

目的:将源代码转换为 Windows 可识别的共享库格式。

  • 参数说明:-shared 指定输出为动态链接库;-o test.dll 指定输出文件名。
  • 操作流程:
  1. 解压下载的 mingw64 压缩包,进入其 bin 目录确认存在 gcc.exe。
  2. 将刚才创建的 test.c 文件复制到该 bin 目录下(便于直接定位命令提示符位置)。
  3. 在 bin 目录下按住 Shift 键点击鼠标右键,选择“在此目录打开 PowerShell/Prompt”。
  4. 输入以下命令并回车执行:
gcc -shared -o test.dll test.c

执行成功后,当前目录下将生成 test.dll 文件。

第三步:配置 C# 项目与引入 DLL

目的:设置 C# 环境并建立与外部 DLL 的连接。

  • 入口:Visual Studio 中新建一个 C# 控制台应用程序。
  • 前置动作:先进行一次编译(Build),确保生成了标准的目录结构(如 bin\Debug\netX.0)。
  • DLL放置:将上一步生成的 test.dll 复制到 C# 项目的输出目录中(通常是 bin\Debug\... 文件夹)。只要它与编译后的 .exe 或 .dll 位于同一目录即可,无需在解决方案中进行“引用”添加。

第四步:编写 C# 调用代码

目的:声明外部函数并使用指针进行不安全类型调用。

  • 关键命名空间:必须引入 using System.Runtime.InteropServices;。
  • 代码逻辑:
using System;
using System.Runtime.InteropServices;

internal class Program
{
    // 使用 DllImport 声明要调用的外部函数
    [DllImport("test.dll", CharSet = CharSet.Unicode)]
    public unsafe static extern void swap(int* a, int* b);

    private static void Main(string[] args)
    {
        int a = 1;
        int b = 2;

        Console.WriteLine($"Before Swap: a={a}, b={b}");

        // 由于使用了指针,必须在 unsafe 上下文中执行
        unsafe
        {
            swap(&a, &b);
        }

        Console.WriteLine($"After Swap: a={a}, b={b}");
        Console.ReadKey();
    }
}

常见排错与注意事项

如果在编译或运行过程中遇到问题,请按照以下清单排查:

  1. 编译错误 (CS0227):
    现象:C# 项目报出有关指针和地址运算符的错误。
    解决:需要在项目属性中开启不安全代码支持。路径为:项目属性 → 生成(Build) → 允许不安全代码(Allow unsafe code),勾选该选项后重新生成。
  2. DLL 未找到 (BadImageFormatException):
    现象:运行时提示无法加载指定的模块。
    解决:检查 test.dll 是否确实在输出目录中,且其架构(x86/x64)与 C# 项目的目标平台一致。例如,如果编译的是 x64 的 dll,C# 也要构建为 x64。
  3. 参数不匹配:
    原因:C# 的签名必须与 C 语言的导出函数严格对应。注意不要漏掉指针类型 *。

简要总结

本文展示了 C# 调用 C 语言 DLL 的标准实践。核心在于使用 GCC 的 -shared 参数正确编译,以及在 C# 中结合 DllImport 和 unsafe 关键字处理非托管内存操作。正确放置 DLL 文件和开启项目的 unsafe 权限是成功运行的关键。

以上就是Windows中使用C#调用C语言生成的dll的详细内容,更多关于C#调用C语言dll的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表