用 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] ......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\cvextern.dll......[OK] ......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\msvcp140.dll......[OK] ......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\opencv_ffmpeg330_64.dll......[OK] ......Free: [OK]
E:\Developer\emgucv-windesktop 3.3.0.2824\libs\x64\vcruntime140.dll......[OK] ......Free: [OK]
-- Completed --
llbtest.cs 源代码:
用csc llbtest.cs编译即可
using System;
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices; class Program
{
static void Main(string[] args)
{
if (args.Length == || args.Length > )
{
ShowHelp();
return;
}
var path = args[];
if (!Directory.Exists(path))
{
ShowHelp();
return;
} var files = Directory.EnumerateFiles(path, "*.dll");
Console.WriteLine($"LoadLibraryExW PATH: {path}");
foreach (var file in files)
{
Console.Write(file);
const int loadLibrarySearchDllLoadDir = 0x00000100;
const int loadLibrarySearchDefaultDirs = 0x00001000;
//const int loadLibrarySearchUserDirs = 0x00000400;
IntPtr handler = NativeMethods.LoadLibraryExW(file, IntPtr.Zero, loadLibrarySearchDllLoadDir | loadLibrarySearchDefaultDirs);
//IntPtr handler = LoadLibraryEx(dllname, IntPtr.Zero, loadLibrarySearchUserDirs);
if (handler == IntPtr.Zero)
{
var error = Marshal.GetLastWin32Error();
var ex = new Win32Exception(error);
Console.WriteLine($"......[ERROR] {ex.NativeErrorCode}: {ex.Message}");
}
else
{
Console.Write($"......[OK] {handler}");
var freeLibrary = NativeMethods.FreeLibrary(handler);
Console.WriteLine($"......Free: {(freeLibrary ? "[OK]" : "[ERROR]")}");
}
}
Console.WriteLine("-- Completed --");
if(args.Length == && args[] == "...")
{
Console.Write("Press any key to exit...");
Console.ReadKey(true);
Console.WriteLine();
}
} private static void ShowHelp()
{
var x = AppDomain.CurrentDomain.FriendlyName;
Console.WriteLine($"Usage:\n\t{x} <path> [...]\n\tpath\tThe directory path that includes *.dll files\n\t...\tPause me when completed.");
}
} [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct HINSTANCE__
{ /// int
public int unused;
} public partial class NativeMethods
{ /// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
///lpLibFileName: LPCWSTR->WCHAR*
///hFile: HANDLE->void*
///dwFlags: DWORD->unsigned int
[DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)]
public static extern System.IntPtr LoadLibraryExW([In()] [MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpLibFileName, System.IntPtr hFile, uint dwFlags); /// Return Type: BOOL->int
///hLibModule: HMODULE->HINSTANCE->HINSTANCE__*
[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
[return: MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool FreeLibrary([In()] System.IntPtr hLibModule);
}
用 LoadLibraryExW 函数测试加载 dll (CSharp、Windows)的更多相关文章
- 在内存中加载DLL
有个需求是把一个DLL作为数据打包到EXE中,运行的时候动态加载.但要求不是释放出来生成DLL文件加载. 花了一天时间做出来.效果还可以. 不过由于是直接分配内存加载DLL的.有一些小缺陷.例如遍历进 ...
- 动态链接库知识点总结之三(如何以显示的方式加载DLL)
总结一下如何显示加载方式加载DLL, 首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图.(详细方法已经在前两篇文章中讲述,如有不懂,打开 ...
- c#动态加载dll文件
1.在写一个记录日志到文件中的类库(生成dll文件copy到一个目录中去,然后在主函数的appconfig中去配置. using System; using System.Collections.Ge ...
- 内存加载DLL
1.前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL ...
- 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试 ...
- 加载dll过程中assembly失败
错误现象: 进行插件读取时出现错误:“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下 ...
- SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块
近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试环境时报无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块. (异常来 ...
- C++动态加载DLL调用方法
一.构建DLL路径 char szTmp[_MAX_PATH]; char* szPath = getcwd(szTmp, _MAX_PATH);//获取当前工作目录 //构建dll路径 strc ...
- 关于Windows平台下应用程序加载DLL模块的问题.
本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...
随机推荐
- 转!!Java虚拟机堆的内存分配和回收
Java内存分配和回收,主要就是指java堆的内存分配和回收.java堆一般分为2个大的区域,一块是新生代,一块是老年代.在新生代中又划分了3块区域,一块eden区域,两块surviver区域.一般称 ...
- 如何实现redis集群?
由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用.Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB.200GB的规模,但是单实例模式限制了Redis没法 ...
- 关于CSDN 2016博客之星评选活动的感触
一.前言 想想去年的这个时候还接到CSDN邀请,参加了"CSDN 2015博客之星"的评选活动, CSDN2015博客之星评选之拉票环节 而今年却没有接到CSDN的邀请,内心有点小 ...
- Linux命令之pip
使用pip进行install,sudo pip install xxx 使用pip进行update,sudo pip install --update xxx 使用pip设置超时时间,sudo pip ...
- java内存相关
(类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象是具体的,占用存储空间.) 1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内 ...
- centos7 vmware克隆解决网络问题
centos7克隆后,发现两台机子之间的MAC相同,无法获取IP.超找资料,解决办法如下: 只要删除网卡的配置文件中的HWADDR和UUID两行就行.使用ifup启动网卡即可.
- Java面向对象—继承
概述: 1.多个类相同的属性和功能抽取成另一个类, 让具有特有功能的类继承这个类. 2.通过 extends 关键字可以实现类与类的继承 格式: class 子类名 extends 父类名 {} 特点 ...
- js 的一些兼容性写法
①添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListener){//检测是否为DOM2级方法 ...
- SVN使用—常用命令及避免冲突的方法
一.SVN启动 [root@localhost ~]# mkdir /data/svn [root@localhost ~]# svnadmin create /data/svn/test [root ...
- Apache 防盗链配置
盗链 网站内有许多的图片地址,或一些我们可以用到的资源,在这种情况下,我可以通过赋值其他图片链接地址,到我自己的平台上,这样相当于盗取了一张图片的链接,那么盗链会有什么危害呢? 当我们盗取一张图片链接 ...