在网上扒了很多使用DllImport("XXX.dll")这种方式,如果把第三方的动态库放在根目录下的确是没什么问题。
现在遇到了一个棘手的问题,就是第三方把整个程序打包要放在自己的程序(WPF)当中,然后把第三方的程序文件比对之后发现好多项目文件和自己的程序冲突了,所以不得不采用另外一种方式,就是在根目录新建文件件来存放第三方程序,但是调用对方的动态库就不行了。
使用绝对路径的方式就不要再说了,是可以的。求教各位有没有什么办法可以解决?
使用委托的方式 调用dll而不是使用DLLImport
①使用
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate bool mtSetUseRunCacheT(IntPtr hBarcode, bool value);定义dll接口委托
①使用kernel32.dll
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPArray)] byte[] dllPath);
[DllImport("kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll")]
private static extern bool FreeLibrary(IntPtr hLibrary);
③跟怒kernel32加载目标dll,
实例化dll内的目标接口委托
(mtSetUseRunCacheT)Marshal.GetDelegateForFunctionPointer(loadFunc("mtSetUseRunCacheT"), typeof(mtSetUseRunCacheT));
兄弟结贴吧,我这个方法绝对性的,路径你可以随便定义已传参的方式
冲突是什么冲突,有冲突解决它不就行了,实在不行了,把其它的放到子目录,还把非托管dll放到根目录。这个要么你动态调用,那付出的代价有些大。
或者你放到子目录,在环境变量 path 里把你的子目录加上,这样它就默认会从你的子目录里找了。
或者直接放到system32目录下,只要保证没有人和你的dll重名就行了。