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)]
  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;

(0)

相关推荐

  • VS2015 C#生成dll文件的方法(32/64)

    下面就为大家分享一下在vs2005中生成dll文件的步骤图文版 新建项目> 模板 > windows > 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ClassLibrary2 { public class Class1 { private int _age; public i

  • C#调用Matlab生成的dll方法的详细说明

    其实整个过程比较简单,但是需要心细一点. 需要的工具:VS2005及以上版本,MATLAB2008B及以上版本,另外非常重要的需要安装一个MATLAB Compiler Runtime,这个文件(MCRInstall.exe)在安装完MATLAB之后就会在安装文件夹下存在,需要搜索一下(因为不同版本的MATLAB可能存放位置不同),把它安装一下就OK了. 接下来在MATLAB中写一个m文件,当然是一个函数啦.然后在matlab命令行下运行deploytool,在图形界面里选.net组件,然后进入

  • C#生成DLL文件的方法小结

    使用csc命令将.cs文件编译成.dll的过程 很多时候,我们需要将.cs文件单独编译成.dll文件, 操作如下: 打开命令窗口->输入cmd到控制台->cd C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 转到vs.net安装的该目录下->执行csc命令csc /target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:\WINDOWS\Microsoft.NET\Framewor

  • C#生成DLL文件的方法

    本文实例讲述了C#生成DLL文件的方法.分享给大家供大家参考.具体分析如下: Visual C#生成DLL文件 VisualC.Delphi或者VB等编程语言来编写的DLL文件,在编译完成以后,产生DLL文件已经是一个可以直接供计算机使用的二进制文件.但用Visual C#编译器生成的受管代码虽然也是二进制文件,但不是可以直接供计算机使用的原始代码,实质上是一种中间语言(IL)代码,需要经过"下一代窗口服务"( Next Generation Windows Services,简写为N

  • 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键不松,再在空白处点击鼠标右键,就可以在右键菜单看见"在此目

  • 在Windows中安装Apache2和PHP4的权威指南

    Apache 2和PHP是创建交互式网站的流行方案,而且成本很低.在Windows中安装Apache 2是一件轻而易举的事情,但要使PHP 4与Apache 2配合无间地运行,就需要一定的技巧. 转自:动态网制作指南 www.knowsky.com 在PHP 4.3手册的Windows安装小节,没有解释如何让PHP与Apache 2配合使用,而有关Apache 2安装的小节缺失了你需要的大量信息.在网上公布的其他安装指南中,也包含了不少错误,使一些安装人员只好不断试验和犯错.例如,有些人甚至将P

  • jQuery中通过ajax调用webservice传递数组参数的问题实例详解

    下面通过实例给大家说明比较直观些,更方便大家了解. 本人的项目中通过jquery.ajax调用webservice. 客户端代码如下: $.ajax({ url: "test/xxx.asmx", type: 'POST', dataType: 'xml', timeout: , data: { name: "zhangsan", tags: ["aa", "bb", "cc"] }, error: fun

  • Windows系统Python直接调用C++ DLL的方法

    环境:Window 10,VS 2019, Python 2.7.12, 64bit 1,打开 VS 2019,新建C++ Windows 动态链接库工程 Example,加入下列文件,如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 DLL: Example.h #pragma once #ifndef CPP_EXPORTS #define CPP_EXPORTS #endif #ifdef CPP_EXPORTS #define CP

  • redis在Windows中下载及安装、设置教程

    一.下载: 下载地址:https://github.com/MicrosoftArchive/redis/releases 根据系统下载的版本:以(64位为例) 下载后一般解压到根目录下:如(E:\Redis-x64-3.2.100) 二.安装: 打开cmd命令窗口,使用命令进行安装和注册redis到window服务 安装命令:redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动服务命令:redis

  • windows中oracle存储过程加密的实例代码

    在硬盘中创建一个过程test.sql create or replace procedure test_bf is begin dbms_output.put_line('test success'); end; 然后通过使用oracle自带的wrap命令对过程进行加密 先打开CMD然后输入命令 wrap iname='input_name' oname='output-name' input_name是需要加密的文件的路径,output_name是输出的文件名,如果没有oname那么生成出来的

  • Qt程序中调用C#编写的dll(推荐)

    1.打开Visual Studio,新建一个C#的Class Library项目(这里选择的是.Net Framework 4),项目名为CSharpDll. 2.由于默认没有引入Forms等UI库,先在reference中添加引用System.Windows.Forms以便可以在测试中使用MessageBox等. 3.最终C#编写的dll的源代码如下图所示,命名空间为CSharpDll,公共类为CSharpClass. using System; using System.Collection

  • windows中dos批处理之命令特殊符号通配符与转义符(推荐)

    目录 常用特殊符号 通配符(?和*) 转义符 对批处理中常用符号的详细解 1.@ 2.%.%% 3.: 和 :: 4.~ 5.>.>> 6.| 7.^ 8.& 9.&&.|| 10.() 11.+.-.*./ 12.equ.neq.lss.leq.gtr.geq 文章进行重新排版,并做了部分补充.所有命令均在win7 x64 中文旗舰版上进行测试. 常用特殊符号 @命令行回显屏蔽符 %批处理变量引导符 > 重定向符 > > 重定向符 <.&

  • MongoDB系列教程(三):Windows中下载和安装MongoDB

    软件下载 下载mongodb最新的包:http://www.mongodb.org/downloads     下载mongodb可视化界面,mongoVUE:http://download.csdn.net/detail/lovesummerforever/8036417   软件安装 mongodb服务端安装步骤如下所示: 1.遵守mongodb规范,选择自己的磁盘创建文件夹,在这里我选择的是D盘,创建如下目录结构   复制代码 代码如下: D:\mongodb  作为安装的根目录    

  • 深入理解JavaScript中的尾调用(Tail Call)

    什么是尾调用? 尾调用是函数式编程里比较重要的一个概念,尾调用的概念非常简单,一句话就能说清楚,它的意思是在函数的执行过程中,如果最后一个动作是一个函数的调用,即这个调用的返回值被当前函数直接返回,则称为尾调用,如下所示: function f(x) { return g(x) } 在 f 函数中,最后一步操作是调用 g 函数,并且调用 g 函数的返回值被 f 函数直接返回,这就是尾调用. 而下面两种情况就不是尾调用: // 情况一 function f(x){ let y = g(x); re

随机推荐