C# 调用C++写的dll的实现方法

 更新时间:2013年10月09日 15:11:17   作者:  
C#调用C++的非托管类的dll其实很简单基本就是固定的调用格式,有需要的朋友可以参考一下

  dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可。然后就是添加一个类添加一个方法。方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可。 例如如下代码:

C++dll代码:

复制代码 代码如下:

extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;}

  C#调用dll基本也是固定格式,如下样式,这边有添加unsafe这是因为有用到指针的缘故[没用指针不需要unsafe],C#用指针必须添加

unsafe,并且在项目属性里面的生成允许不安全代码打钩才行.

  还有一点是C#调用DLL需要添加命名空间

复制代码 代码如下:

using System.Runtime.InteropServices;

  代码样式如下:

C#调用代码:

复制代码 代码如下:

[DllImport("dll名字.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
unsafe public static extern byte* ShowImages(byte[] src, int w, int h);

  按照如上编写dll以及调用失败原因多数可能就是C++的C#的数据类型没有对应的原因。

  最后还有一点要提的是,具有指针返回值的方法,该指针变量在C++中必须是全局的,方法体里的私有的会出错。原因是出了方法体就被释放了,虽然是return出来的,也没有效果。
  这个问题我之前就遇到过, C++里面return出来一个指针地址,然后C#里面调用,出来的数据乱七八糟,当时一直很郁闷,后来终于发现原因就是指针return出来还是会被释放掉,所以获得的数据乱七八糟。解决方法当然是把指针变量设成全局变量。

相关文章

  • C#获取微信小程序的云数据库中数据的示例代码

    C#获取微信小程序的云数据库中数据的示例代码

    本文主要介绍了C#获取微信小程序的云数据库中数据的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • LINQ操作符SelectMany的用法

    LINQ操作符SelectMany的用法

    这篇文章介绍了LINQ操作符SelectMany的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#中隐藏TabControl选项卡标签的解决方案

    C#中隐藏TabControl选项卡标签的解决方案

    这篇文章主要介绍了C#中隐藏TabControl选项卡标签的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Unity Shader实现素描风格的渲染

    Unity Shader实现素描风格的渲染

    这篇文章主要为大家详细介绍了Unity Shader实现素描风格的渲染,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#串口编程System.IO.Ports.SerialPort类

    C#串口编程System.IO.Ports.SerialPort类

    这篇文章介绍了C#串口编程System.IO.Ports.SerialPort类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • .Net笔记:System.IO之Stream的使用详解

    .Net笔记:System.IO之Stream的使用详解

    本篇文章是对.Net中System.IO之Stream的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • .Net多进程通信共享内存映射文件Memory Mapped

    .Net多进程通信共享内存映射文件Memory Mapped

    这篇文章主要介绍了.Net多进程通信共享内存映射文件Memory Mapped的使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • C# 中 List 与 List 多层嵌套不改变原值的实现方法(深度复制)

    C# 中 List 与 List 多层嵌套不改变原值的实现方法(深度复制)

    这篇文章主要介绍了C# 中 List 与 List 多层嵌套不改变原值的实现方法,使用 BinaryFormatter 将原始 List 序列化为字节流,然后再反序列化得到新的 List,实现了深度复制,需要的朋友可以参考下
    2024-03-03
  • C#实现拼图小游戏

    C#实现拼图小游戏

    这篇文章主要为大家详细介绍了C#实现拼图小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C#技巧之快速删除bin和obj文件夹的方法

    C#技巧之快速删除bin和obj文件夹的方法

    C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除
    2013-07-07

最新评论