用 LoadLibraryExW 函数测试加载 dll (CSharp、Windows)

效果如下:

$ llbtest "E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64"
LoadLibraryExW PATH: E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\concrt140.dll......[OK] 140734063771648......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\cvextern.dll......[OK] 140733428531200......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\msvcp140.dll......[OK] 140734063509504......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\opencv_ffmpeg330_64.dll......[OK] 1724645376......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\vcruntime140.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:\n\t{x} <path> [...]\n\tpath\tThe directory path that includes *.dll files\n\t...\tPause 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 }

 

posted @ 2017-11-01 10:39  Bob-wei  阅读(1104)  评论(0编辑  收藏  举报