问题描述: 最近项目中需要导入一个C语言封装好的DLL,由于之前没接触过相关操作,直接导入工程添加引用,结果报错“未能添加对”XXXX.dll“的引用。请确保文件可访问并且是一个有效的程序集或COM组件”。网上搜索,原因为此DLL为非托管的DLL。
托管DLL:完全由.NET托管代码实现的dll,完全依赖于.NET平台的CLR运行。托管dll受.NET CLR管控,支持内存自动回收等的,对于.NET平台是安全dll(用.net代码实现的dll,可以是用C#, VB.NET,F#等实现的)
非托管DLL:是指完全或者部分不是用.NET代码实现,不依赖于.NET平台即可运行,例如COM方式的dll,不支持自动回收内存,对于.NET平台而言,也是非安全可控的。(完全不是或部分不是用.net代码实现的dll,可能是C/C++实现)。
解决方式:
非托管的DLL只能使用DllImport方式导入,新建一个类,通过这个类去调用dll中的方法。
public static class DllImport
{
[DllImport("dll名", EntryPoint = "方法名", CallingConvention = CallingConvention.Cdecl)]
public static extern int Init(//有参数添加参数);
[DllImport("dll名", EntryPoint = "Release", CallingConvention = CallingConvention.Cdecl)]
public static extern void Release();
}
此种方式下,需要用到哪些方法就需要写几个上面的导入方法,其中”dll名“无需添加后缀,EntryPoint为你需要导入的dll中的方法名,CallingConvention为调用约定,关于调用约定可以参考 https://blog.csdn.net/yaokang522/article/details/49382945
public后接的返回值类型为dll中方法的返回值类型,方法名可自定,无需与dll中的方法名一致,若有dll中方法有参数,则添加相印参数即可。