VC.dll相关及其C#交互

来源:互联网 发布:单端口环路检测 编辑:程序博客网 时间:2024/04/29 18:47

方法步骤:

1.新建工程:

   如果需要MFC的支持,可以选择MFC AppWizard(dll)工程类型,如果不需要,可以选择Win32(dll).

2.编写内部代码:

   该部分过程与建立一般的exe文件大同小异,在此不再赘述。

3.编写关键代码:

   在关键的头文件中添加dll库导出接口:其中导出类的声明之前要加注宏定义AFX_EXT_CLASS;导出函数则在生命之前添加extern "C" __declspec(dllexport)的字样。

4.引入相应的Demo程序

Demo程序在引用dll时分为静态和动态两种:

1>静态加载:

   将相应的dll文件放入Demo.exe的目录下,将dll编译生成的lib文件和包含有导出接口的关键头文件放入程序的编译目录下。

   而后在用到库函数的地方#include关键头文件,在Project---->setting---->link中添加相应的lib文件名称。执行即可。

2>动态加载:

VC中.dll文件的动态加载方法:

 

另附:

C#中动态调用.dll文件的方法:

C#惯于利用反射进行动态加载和调用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将此程序集所依赖的程序集加载进来,需后辍名.dll
Assembly.LoadFile 只加载指定文件,并不会自动加载依赖程序集.Assmbly.Load无需后辍名
加载dll后,需要使用dll中某类.
Type type=ass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型
需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的参数实例话类型
调用类型中的某个方法:
需要首先得到此方法
MethodInfo mi=type.GetMethod(“MehtodName”);//通过方法名称获得方法
然后对方法进行调用,多态性利用参数进行控制

mi.Invoke(obj,params[]);//根据参数直线方法,返回值就是原方法的返回值

 

5.注意:如果想实现该dll文件的跨平台调用,比如C#调用,则其类型必须是Win32以及MFC中的静态dll,动态dll是不可调用的。

 

以下为C#调用非托管.dll方法:

 

 

引入相应的命名空间:

using System.Runtime.InteropServices;

引入dll文件并声明导出函数

[DllImport("name.dll")]
private static extern style name(/*函数参数表*/);
           

注意:引入的dll文件必须是VC中的Win32dll或者MFC静态dll,MFC规则dll和MFC扩展dll均是不可用的!!; 除此之外,MFC的三种dll中的前两种只能用于导出全局方法,而第三种只能用于导出类。

随后的调用便和C#调用托管dll文件相同。

直接引入非托管的dll文件,之所以会找不到程序的入口,就是因为缺少了声明导出函数这至为关键的一步。

原创粉丝点击