問題描述: 最近項目中需要導(dǎo)入一個C語言封裝好的DLL拒担,由于之前沒接觸過相關(guān)操作嘹屯,直接導(dǎo)入工程添加引用,結(jié)果報錯“未能添加對”XXXX.dll“的引用从撼。請確保文件可訪問并且是一個有效的程序集或COM組件”州弟。網(wǎng)上搜索,原因為此DLL為非托管的DLL低零。
托管DLL:完全由.NET托管代碼實現(xiàn)的dll婆翔,完全依賴于.NET平臺的CLR運(yùn)行。托管dll受.NET CLR管控掏婶,支持內(nèi)存自動回收等的啃奴,對于.NET平臺是安全dll(用.net代碼實現(xiàn)的dll,可以是用C#, VB.NET,F#等實現(xiàn)的)
非托管DLL:是指完全或者部分不是用.NET代碼實現(xiàn)雄妥,不依賴于.NET平臺即可運(yùn)行最蕾,例如COM方式的dll,不支持自動回收內(nèi)存老厌,對于.NET平臺而言瘟则,也是非安全可控的。(完全不是或部分不是用.net代碼實現(xiàn)的dll梅桩,可能是C/C++實現(xiàn))壹粟。
解決方式:
非托管的DLL只能使用DllImport方式導(dǎo)入拜隧,新建一個類宿百,通過這個類去調(diào)用dll中的方法。
public static class DllImport
{
[DllImport("dll名", EntryPoint = "方法名", CallingConvention = CallingConvention.Cdecl)]
public static extern int Init(//有參數(shù)添加參數(shù));
[DllImport("dll名", EntryPoint = "Release", CallingConvention = CallingConvention.Cdecl)]
public static extern void Release();
}
此種方式下洪添,需要用到哪些方法就需要寫幾個上面的導(dǎo)入方法垦页,其中”dll名“無需添加后綴,EntryPoint為你需要導(dǎo)入的dll中的方法名干奢,CallingConvention為調(diào)用約定,關(guān)于調(diào)用約定可以參考 https://blog.csdn.net/yaokang522/article/details/49382945
public后接的返回值類型為dll中方法的返回值類型痊焊,方法名可自定,無需與dll中的方法名一致忿峻,若有dll中方法有參數(shù)薄啥,則添加相印參數(shù)即可。