当前位置: 首页 > 编程笔记 >

windows中使用C# 调用 C语言生成的dll

楚羽
2023-03-14
本文向大家介绍windows中使用C# 调用 C语言生成的dll,包括了windows中使用C# 调用 C语言生成的dll的使用技巧和注意事项,需要的朋友参考一下

首先建立一个C语言源文件test.c

void swap(int* a, int* b)
{
 int c = *a;
 *a = *b;
 *b = c;
}

然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc。偷懒的做法是直接把刚才做好的test.c复制到这个bin目录中,和gcc.exe在一个目录,然后在此目录下,按住shift键不松,再在空白处点击鼠标右键,就可以在右键菜单看见“在此目录运行命令提示符”的选项,打开,输入命令

gcc -shared -o test.dll test.c

就可以把c源文件编译成dll,名字为test.dll(直接用cygwin里面的gcc是不行的,如果你不知道cygwin是什么,忽略这句话。)选择按修改时间排序,就可以在此目录最上面看见生成的test.dll

然后在VS中建立C#控制台项目,先编译一下,生成成功,以生成需要的目录。然后在项目上右键,选择在资源管理器中打开,然后把test.dll复制到bin下的Debug目录下,然后按照下面的代码修改。

using System;
using System.Runtime.InteropServices;

internal class Program
 {
  [DllImport("test.dll", CharSet = CharSet.Unicode)]
  html" target="_blank">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
   {
    swap(&a, &b);
   }
   Console.WriteLine($"After Swap a={a},b={b}");
   Console.WriteLine("\n");
 
   Console.ReadKey();
  }

  DLL导入特性声明了要调用的函数,之后就可以调用这个方法。因为在C#源代码中使用了指针和取地址符号,所以要用unsafe代码块。

注意:不需要在项目引用那里引用这个dll,只需要和可执行文件放在一起就好了。

注意:因为用了unsafe代码块,编译无法通过,要在项目属性里面build选项卡里面的允许unsafe勾上,就可以了。

注意:using System.Runtime.InteropServices;

 类似资料:
  • 在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之

  • 在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声

  • 本文向大家介绍C语言/C++如何生成随机数,包括了C语言/C++如何生成随机数的使用技巧和注意事项,需要的朋友参考一下 本文分享了C语言/C++如何生成随机数的具体实现方法,供大家参考,具体内容如下 C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。 (1) 如果你只要产生随机数而不需要设定范围的

  • linux Debian Buster go版本go1.11.6 linux/amd64 gcc版本8.3.0(Debian 8.3.0-6) libmylib.go mylib.h 主.cpp CGO _ ENABLED = 1 go build-o libmylib . so-build mode = c-shared libmylib . go g -L/路径/到/库/ -利米利布 main

  • 本文向大家介绍C#语言Parallel.Invoke 并行调用,包括了C#语言Parallel.Invoke 并行调用的使用技巧和注意事项,需要的朋友参考一下 示例 并行调用方法或动作(并行区域)