效果如下:
$ llbtest "E:Developeremgucv-windesktop 3.3.0.2824libsx64" LoadLibraryExW PATH: E:Developeremgucv-windesktop 3.3.0.2824libsx64 E:Developeremgucv-windesktop 3.3.0.2824libsx64concrt140.dll......[OK] 140734063771648......Free: [OK] E:Developeremgucv-windesktop 3.3.0.2824libsx64cvextern.dll......[OK] 140733428531200......Free: [OK] E:Developeremgucv-windesktop 3.3.0.2824libsx64msvcp140.dll......[OK] 140734063509504......Free: [OK] E:Developeremgucv-windesktop 3.3.0.2824libsx64opencv_ffmpeg330_64.dll......[OK] 1724645376......Free: [OK] E:Developeremgucv-windesktop 3.3.0.2824libsx64vcruntime140.dll......[OK] 140734064033792......Free: [OK] -- Completed --
llbtest.cs 源代码:
用csc llbtest.cs编译即可
1 using System; 2 using System.ComponentModel; 3 using System.IO; 4 using System.Runtime.InteropServices; 5 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 if (args.Length == 0 || args.Length > 2) 11 { 12 ShowHelp(); 13 return; 14 } 15 var path = args[0]; 16 if (!Directory.Exists(path)) 17 { 18 ShowHelp(); 19 return; 20 } 21 22 var files = Directory.EnumerateFiles(path, "*.dll"); 23 Console.WriteLine($"LoadLibraryExW PATH: {path}"); 24 foreach (var file in files) 25 { 26 Console.Write(file); 27 const int loadLibrarySearchDllLoadDir = 0x00000100; 28 const int loadLibrarySearchDefaultDirs = 0x00001000; 29 //const int loadLibrarySearchUserDirs = 0x00000400; 30 IntPtr handler = NativeMethods.LoadLibraryExW(file, IntPtr.Zero, loadLibrarySearchDllLoadDir | loadLibrarySearchDefaultDirs); 31 //IntPtr handler = LoadLibraryEx(dllname, IntPtr.Zero, loadLibrarySearchUserDirs); 32 if (handler == IntPtr.Zero) 33 { 34 var error = Marshal.GetLastWin32Error(); 35 var ex = new Win32Exception(error); 36 Console.WriteLine($"......[ERROR] {ex.NativeErrorCode}: {ex.Message}"); 37 } 38 else 39 { 40 Console.Write($"......[OK] {handler}"); 41 var freeLibrary = NativeMethods.FreeLibrary(handler); 42 Console.WriteLine($"......Free: {(freeLibrary ? "[OK]" : "[ERROR]")}"); 43 } 44 } 45 Console.WriteLine("-- Completed --"); 46 if(args.Length == 2 && args[1] == "...") 47 { 48 Console.Write("Press any key to exit..."); 49 Console.ReadKey(true); 50 Console.WriteLine(); 51 } 52 } 53 54 private static void ShowHelp() 55 { 56 var x = AppDomain.CurrentDomain.FriendlyName; 57 Console.WriteLine($"Usage: {x} <path> [...] path The directory path that includes *.dll files ... Pause me when completed."); 58 } 59 } 60 61 62 63 64 65 [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] 66 public struct HINSTANCE__ 67 { 68 69 /// int 70 public int unused; 71 } 72 73 public partial class NativeMethods 74 { 75 76 /// Return Type: HMODULE->HINSTANCE->HINSTANCE__* 77 ///lpLibFileName: LPCWSTR->WCHAR* 78 ///hFile: HANDLE->void* 79 ///dwFlags: DWORD->unsigned int 80 [DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)] 81 public static extern System.IntPtr LoadLibraryExW([In()] [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpLibFileName, System.IntPtr hFile, uint dwFlags); 82 83 84 /// Return Type: BOOL->int 85 ///hLibModule: HMODULE->HINSTANCE->HINSTANCE__* 86 [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")] 87 [return: MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)] 88 public static extern bool FreeLibrary([In()] System.IntPtr hLibModule); 89 }