首先从msdn了解到,DllImport是用来 将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开

从以上语句我们可以理解出三点:
1.C++编写的非托管dll可以通过DllImport引入到C#中;
2.引入到C#中的只能是C++方法(或者说函数),而不能是数据(或者说变量);
3.引入到C#中后只能声明为静态函数;
msdn关于DllImport属性类的链接:
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.dllimportattribute(v=VS.100).aspx
DllImport的其使用格式如下所示:
[DllImport("compute.dll", EntryPoint = "FunName", CharSet =CharSet.Auto)]
public static externint FunName(typevar);
注:其引入格式中static和extern是必不可少的;
接下来主要讲述如何通过DllImport将C++类通过dll引入到C#:
1.生成包含C++类的dll
源代码如下所示:
computer.h:
#pragma once
class computer
{
computer();
public:
__declspec(dllexport) int sum(int mem1,int mem2);//计算两个参数之和:mem1+mem2
__declspec(dllexport) int sum();//计算两个成员变量之和:computer::mem1+computer::mem2
__declspec(dllexport) int sub(int mem1,int mem2);//计算两个参数之差:mem1-mem2
__declspec(dllexport) int sub();//计算两个成员变量之差:computer::mem1-computer::mem2
__declspec(dllexport) void setmember(int m1,int m2);//设定两个成员静态变量mem1和mem2的值
__declspec(dllexport) int getmember(int index);//index=1或2,分别读取mem1和mem2的值
private:
static int mem1;//只有声明为静态变量,才可以在C#中访问修改
static int mem2;
};
int computer::mem1=8;//静态成员初始化
int computer::mem2=9;
实现代码不在此赘述,编译生成dll。
2.将生成dll放置到C#工程的debug\bin目录下;
3.向C#工程中引入此dll并导入编写的类
向C#工程中添加新类computer,在生成的computer.cs文件中添加代码:
using System.Runtime.InteropServices;//此语句保证能够调用DllImport
编写computer类的代码如下:
  class computer
  {
     [DllImport("compute.dll", EntryPoint ="?getmember@computer@@QAEHH@Z", CharSet = CharSet.Auto)]
     public static extern int getmember(intindex);
     [DllImport("compute.dll",EntryPoint="?setmember@computer@@QAEXHH@Z",CharSet=CharSet.Auto)]
     public static extern void setMember(int m1,intm2);
     [DllImport("compute.dll", EntryPoint ="?sum@computer@@QAEHHH@Z", CharSet = CharSet.Auto)]
     public static extern int sum(int mem1, intmem2);
     [DllImport("compute.dll", EntryPoint ="?sum@computer@@QAEHXZ", CharSet = CharSet.Auto)]
     public static extern int sum();
     [DllImport("compute.dll", EntryPoint ="?sub@computer@@QAEHHH@Z", CharSet = CharSet.Auto)]
     public static extern int sub(int mem1, intmem2);
     [DllImport("computer.dll", EntryPoint ="?sub@computer@@QAEHXZ", CharSet = CharSet.Auto)]
     public static extern int sub();
  }
具体DllImport的参数属性等请参考如下链接:
http://blog.csdn.net/jame_peng/article/details/4387906
4.在主程序中进行验证
由于引入的方法都是静态的,所以不能通过对象进行调用,而只能通过类来调用,具体代码如下:
        computer.setMember(4, 5);
        Console.WriteLine(computer.getmember(1));
        Console.WriteLine(computer.getmember(2));
        Console.WriteLine(computer.sum());
        Console.WriteLine(computer.sum(1,2));
        Console.WriteLine(computer.sub(3,1));
经验证,这样的方法是可行的。
最后,总结一下:
1.非托管的C++函数是可以通过dll经由DllImport引入到C#中,不过就变成静态的了;
2.非托管的C++类也可以通过以上方法引入到C#中,不过就相当于成为了静态类,使用受到了很大限制,不可以再定义多个对象了;

C#通过DllImport引入dll中的C++非托管类相关推荐

  1. C#中IDisposable 回收非托管资源

    C#中IDisposable 更多2014/9/7 来源:C#学习浏览量:4185 学习标签: IDisposable 本文导读:C#中IDisposable接口的主要用途是释放非托管资源.当不再使用 ...

  2. “System.Runtime.InteropServices.COMException”类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 检索 COM 类工厂中 CLSID

    修改项目.net framework版本后出现的异常,解决办法:右键项目->属性->生成->目标平台为x86就解决了.

  3. java中map使用非系统类作为key

    为什么80%的码农都做不了架构师?>>>    需要覆写equals和hashCode方法 import java.util.Map ; import java.util.HashM ...

  4. C#直接使用DllImport外部Dll的方法

    C#.Net调用基本格式: [DLLImport("DLL文件路径")] 修饰符 extern 返回值类型 方法名称(参数列表) 如: [csharp] view plain co ...

  5. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]

    最近的一个项目中遇到了调用别人的sdk接口(dll库)而传给我的是一个vector指针,用完之后还要我来删除的情况.这个过程中首先就是在我的exe中将其vector指针转为相应指针再获取vector中 ...

  6. C#调用非托管dll文件

    C#调用非托管dll文件 C#中如何调用动态链接库DLL C#对两种类型动态库的使用 1.托管 2.非托管 C#调用非托管dll 一.C++头文件样子 解决方案: 二.使用DLLImport类 三.二 ...

  7. 关于Dll、Com组件、托管dll和非托管dll的理解

    Com组件和dll区别: 1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册. 2.Com组件是微软的一个协议,满足com组件协议的dll文件就是co ...

  8. 为什么一个java源文件中只能有一个public类

    多个public类 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同. 原因 ...

  9. .NET中的托管资源与非托管资源

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...

最新文章

  1. Oracle控制文件的重建
  2. HDU 1518 Square
  3. 【MFC】创建第一个MFC界面项目
  4. centos 7 快速安装nginx
  5. 二元相图软件_FactSage 软件教程 入门学习资料汇总
  6. 边界安全技术简要说明
  7. c#获取屏幕上某坐标点的颜色
  8. java两个数组中不同的数字_【Java】 剑指offer(56-1) 数组中只出现一次的两个数字...
  9. 软件测试简历中的项目应该如何准备?
  10. 那个只能在win7的扫雷游戏,你能通关吗?今天用Python教大家,上号!!!
  11. python+opencv+图像几何变换(图片缩放、剪切、位移、镜像,放射变换,旋转)
  12. 优动漫PAINT实用宝典(图层篇)——栅格图层
  13. 钱我所欲也,健康我所欲也,舍钱而取健康也
  14. 专升本英语——语法知识——基础语法——第一节 名词和代词【学习笔记】
  15. 离散数学——图论中图的同构的应用
  16. 7-4 帅到没朋友(20 分)
  17. 爆破的思路和断点的设置
  18. 微服务开放平台接口设计
  19. AWS云计算技术架构探索系列之一-开篇
  20. 海信智慧黑板Android版本,海信智慧黑板,给老师减负,再也不用“喝”粉笔末了...

热门文章

  1. UILabel 根据text的内容来调整大小
  2. 远程链接错误:这可能是由于credssp加密oracle修正
  3. Node — 第六天(前后端分离)及(身份验证)
  4. d3.js 共享交换平台demo
  5. 【转发】实现yolo3模型训练自己的数据集总结
  6. 【转】Castle Windsor之组件注册
  7. NULL、nil、Nil、NSNull的区别
  8. BigDecimal.setScale 处理java小数点
  9. HTML标签类型及特点
  10. ES5-拓展 原型链、继承、类