方法步骤:
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文件,之所以会找不到程序的入口,就是因为缺少了声明导出函数这至为关键的一步。
标签:MFC,C#,调用,导出,dll,VC,加载 From: https://blog.51cto.com/kenkao/5991236