C#非强签名dll搜索顺序

由于不是强签名dll,所以无效考虑全局程序集缓存 (GAC)。

预备工作

新建解决方案ClassLibrary1,新建类库ClassLibrary1,新建控制台程序ShowDllLoc。

利用VS添加引用。

一,利用app.config设置codebase,设置dll的加载路径为:codebaselibs\ClassLibrary1.dll 。
二,利用app.config设置私有目录为libs。

<?xml version="1.0" encoding="utf-8" ?>
		<dependentAssembly>
			<assemblyIdentity name="ClassLibrary1"
							  culture="neutral" />
			<codeBase version="1.0.0.0"
					  href="codebaselibs\ClassLibrary1.dll" />
		</dependentAssembly>
	</assemblyBinding>
</runtime>

建立一个类库,只有一个函数
public class Class1
{
public static void ShowLoc()
{
Console.WriteLine(typeof(Class1).Assembly.Location);
}
}
建立控制台项目,主函数为:
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("begin ");
ClassLibrary1.Class1.ShowLoc();
Console.ReadKey();
}
}

实验

一,在codebaselibs、exe所在目录、ClassLibrary1、libs目录各存放一个ClassLibrary1.dll。
启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll
结论:优先加载codebase设置目录的dll。
二,删除codebaselibs目录的dll。
启动程序,程序崩溃退出。
结论:如果设置了codebase只会在codebase目录寻找。
三,删除codebase设置。
启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1.dll
优先加载 exe目录的dll。
四,删除exe所在目录的dll。
启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1\ClassLibrary1.dll
优先加载dll同名目录的dll。
五,删除ClassLibrary1目录的dll。
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\libs\ClassLibrary1.dll
结论:最后加载私有目录的dll。
动态加载
static void Main(string[] args)
{
Console.WriteLine("begin ");
Assembly asm = Assembly.Load(“ClassLibrary1”);
Console.WriteLine(asm.Location);
Console.ReadKey();
}
一,4个目录都有dll。启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1.dll
结论:优先加载exe所在目录的dll。
二,删除exe目录的dll。启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\ClassLibrary1\ClassLibrary1.dll
结论:优先加载和dll同名的目录。
三,删除和dll同名目录的dll。启动程序,结果如下:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\libs\ClassLibrary1.dll
四,删除私用目录的dll。启动程序,结果如下:
程序崩溃。
结论:动态加载dll,不会在codebase目录寻找。

自动加载会影响收到加载

如果同时手动加载和自动加载,手动加载和自动加载的都会加载codbase目录。
测试VS版本VS2022或VS2019。
static void Main(string[] args)
{
Console.WriteLine("begin ");
Assembly asm = Assembly.Load(“ClassLibrary1”);
ClassLibrary1.Class1.ShowLoc();
Console.WriteLine(asm.Location);
Console.ReadKey();
}
}
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll
更换调用顺序也是如此:
begin
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll
C:\Code\Test\ClassLibrary1\ShowDllLoc\bin\Debug\codebaselibs\ClassLibrary1.dll

如果添加了引用,但没有调用此类库的函数,此dll并不会自动加载。

手动加载不会影响自动加载

static void Main(string[] args)
{
Console.WriteLine("begin ");
string strPathName = AppDomain.CurrentDomain.BaseDirectory + “libs2\ClassLibrary1.dll”;
Assembly asm = Assembly.LoadFile(strPathName);
Console.WriteLine(asm.Location);
ClassLibrary1.Class1.ShowLoc();
Console.ReadKey();
}
手动加载成功,自动加载失败而崩溃。和是否设置codebase无关。

dllcalldll.dll引用另外一个dll

dllcalldll.dll和exe的app.config都配置了codebase,那个有效。经测试,无论exe是否配置codebase, dllcalldll.dll的codebase永远无效。

小技巧

可以手动通过修改ShowDllLoc.exe.config来临时修改codebase目录。

C# 动态加载dll

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关

下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索海外市场舆情:云手机助力企业赢得全球竞争

在全球化的趋势下&#xff0c;越来越多的企业将目光投向海外市场&#xff0c;迎接着无尽的商机与挑战。然而&#xff0c;随之而来的是境外市场舆情的复杂变化&#xff0c;对企业的声誉和发展带来了潜在风险。如何准确、及时地掌握境外市场的舆情动向&#xff0c;成为了企业必须…

RabbitMQ介绍及搭建

架构 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff0c;使用erlang语言编写&#xff0c;依赖Erlang环境运行。 Broker&#xff1a;运行消息队列服务进程的节点&#xff0c;包含Exchange、Queue&#xff1b; Producer&#xff1a;消…

C语言:自定义类型:结构体

目录 1. 前言 2. 结构体初识 3. 结构体创建变量 3.1 方法一 3.2 方法二 4. 结构体初始化 5. 结构体自引用 6. 结构体的大小 6.1 结构体对齐规则 6.2 常规结构体 6.3 结构体成员含数组 6.4 结构体嵌套结构体 6.5 为什么存在结构体对齐&#xff1f; 6.6 修改默认对…

idea创建angular项目

1.idea创建项目 idea&#xff1a;2023.2.3版本 不做赘述&#xff0c;我这里是创建模块&#xff0c;创建项目的话大同小异 2.创建完成后注意一下红色部分&#xff0c;后期需要 3.进入项目根目录 注意&#xff1a;一定要进入项目根目录&#xff0c;就是我们上面红色方框部分&a…

Java安全 反序列化(4) CC1链-LazyMap版

Java安全 反序列化(4) CC1链-LazyMap版 实验环境:存在漏洞的版本 commons-collections3.1-3.2.1 jdk 8u71之后已修复不可利⽤ 文章目录 Java安全 反序列化(4) CC1链-LazyMap版一.跟踪挖掘CC1_LazyMap原理二.完整CC1_Lazy版Poc 接着上一篇文章我们通过ChainedTransFormer实现任意…

vue3+threejs新手从零开发卡牌游戏(二):初始化场景

在删掉初始化中一些没用的代码后&#xff0c;在views目录下新建game文件夹&#xff0c;在里面新建一个index.vue&#xff0c;这里就当成游戏的主入口。 目录结构如下&#xff1a; 下面开始尝试创建场景&#xff1a; 一、添加一个div作为threejs的画布对象&#xff0c;之后整个…

电网的正序参数和等值电路(一)

本篇为本科课程《电力系统稳分析》的笔记。 本篇为第二章的第一篇笔记。 电力系统正常运行中&#xff0c;可以认为系统的三相结构和三相负荷完全对称。而对称三相的计算可以用一相来完成&#xff0c;其中所有给出的标称电压都是线电压的有效值&#xff0c;假定系统全部是Y-Y型…

如何将软件大规模部署到基于 Linux 的 IoT 设备

物联网( IoT) 改变了我们与世界互动的方式&#xff0c;将无数设备连接到互联网&#xff0c;从我们家中的智能恒温器到制造工厂的工业传感器。这些 IoT 设备的很大一部分依赖于 Linux 操作系统&#xff0c;因为它具有灵活性、稳健性和开源特性。 将软件大规模部署到基于 Linux …

react-jsx

react04 jsx语法 - 01 基础知识&#xff1a; jsx javascript xml(html) 把js和heml标签混合到一起 react视图编写及构建的简要流程 &#xff1a; 如何在react中使vs code支持格式化和快捷键提示&#xff1a;1, 2,修改文件后缀为jsx&#xff0c;因为webpack的打包规则中可以…

【蓝桥杯】RMQ(Range Minimum/Maximum Query)

一.概述 RMQ问题&#xff0c;是求区间最大值或最小值&#xff0c;即范围最值问题。 暴力解法是对每个询问区间循环求解&#xff0c;设区间长度n&#xff0c;询问次数m&#xff0c;则复杂度是O ( nm )。 一般还可以使用线段树求解&#xff0c;复杂度是O(mlogn)。 但还有一种…

守护数据安全,远离.locked勒索病毒:有效防御策略分享

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络空间的安全问题日益凸显&#xff0c;其中勒索病毒便是一种严重的网络安全威胁。近年来&#xff0c;.locked勒索病毒逐渐进入人们的视野&#xff0c;其强大的破坏性和高隐蔽性使得许多个人和企业深受其害。本文将对.lo…

比堆垛机方案省电65% 实施快50% 四向车系统柔性化建设进程异军突起

对物流企业来说&#xff0c;供应链的数智化升级并非“赶时髦”&#xff0c;它需要找到一个既懂物流行业&#xff0c;又有数字化技术作基础的仓储方案提供商。而河北沃克基于AI底层技术、软硬一体化产品体系和技术创新行业经验双轮驱动的业务团队等“技术产品人才”三位一体优势…

AndroidStudio 由dolphin升级到giraffe,出现“gradle project sync failed“

1 现象描述 将AS由之前的dolphin版本升级到giraffe之后&#xff0c;接着打开以前的Android project&#xff0c;出现了"Gradle project sync failed…"的异常提示&#xff0c;在build面板中并没有出现project sync过程中报错的日志。 异常提示如下图所示&#xff1a…

知识蒸馏——深度学习的简化之道 !!

文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里&#xff0c;大型神经网络因其出色的性能和准确性而备受青睐。然而&#xff0c;这些网络通常包含数百万甚至数十亿个参数&#xff0c;使得它们在资源受限的环境下&…

【OpenGL手册19】几何着色器

目录 一、说明 二、渲染管线的逻辑 三、几何着色器 四、使用几何着色器 五、造几个房子 六、几何着色器渲染爆破物体 一、说明 如果说用顶点和片段着色器干了什么&#xff0c;其实不多。加入几何着色器&#xff0c;能够加大渲染能力&#xff0c;简化数据结构&#xff0c;…

前端项目部署后,如何提示用户版本更新

目录 前言解决方案1、public目录下新建manifest.json2、写入当前时间戳到manifest.json3、检查版本更新4、woker线程5、入口文件引入 可能出现的问题好书推荐 前言 项目部署上线后&#xff0c;特别是网页项目&#xff0c;提示正在操作系统的用户去更新版本非常 important。一般…

Java并发

目录 线程 什么是线程 进程和线程的区别 线程的生命周期 什么是多线程 并发与并行 多线程的三种实现方式 继承Thread类 1.创建类继承Thread类 2.重写run&#xff08;&#xff09;方法 3.创建对象启动线程 实现Runnable接口 1.自己定义一个类实现Runnable接口 2.重…

java-11-openjdk-11.0.xxx/lib/tzdb.dat (No such file or directory)

项目用的是JAVA 11 build 的时候报错 ava-11-openjdk-11.0.xxx/lib/tzdb.dat (No such file or directory)这个问题困扰了很久&#xff0c;最终在redhat 上找到了root case: 该版本JDK 有bug 别挣扎了直接升级JDK

进程创建,程序加载运行,以及进程终止,什么是僵尸进程,什么是孤儿进程

进程控制 创建进程&#xff0c;撤销进程&#xff0c;实现进程转换&#xff08;必须一气呵成&#xff0c;使用原语&#xff09; 原语不被中断是因为有关中断指令 创建进程 撤销进程 进程创建fork fork&#xff08;&#xff09;函数会创建一个子进程&#xff0c;子进程会返…

HarmonyOS 应用开发案例

本帖下方集中了HarmonyOS Next应用开发时&#xff0c;会遇到的常见应用案例。后续会持续更新大量案例&#xff0c;帮助开发者快速学习。欢迎感兴趣的同学加入Q&#xff1a;454901491 72.手写绘制及保存图片案例&#xff08;0319更新&#xff09;&#xff08;点此查看源码实现&…