0
点赞
收藏
分享

微信扫一扫

VC.dll相关及其C#交互


方法步骤:

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文件的动态加载方法:

 

//initCommDll()必须在调用扩展函数前调用

//mydllfun为示例函数


///函数调用定义,函数参数类型,返回类型应该与dll中一致
typedef DWORD (_stdcall MYDLLFUN)(mytype myparameter);


//函数指针声明

static HINSTANCE hmydll;

static MYDLLFUN *mydllfun;


void initCommDll()
{
hmydll=::LoadLibrary("mydll.DLL");
VERIFY(mydllfun=(MYDLLFUN *)::GetProcAddress(hmydll,"mydllfun"));
}

另附:

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文件,之所以会找不到程序的入口,就是因为缺少了声明导出函数这至为关键的一步。

举报

相关推荐

0 条评论