C#非强签名dll搜索顺序

news2024/9/20 4:47:31

由于不是强签名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++**实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算结构体的大小(结构体的内存对齐)

一&#xff1a;问题 问题所在&#xff1a;两个结构体应该都是6个字节大小&#xff0c;为什么一个12&#xff0c;一个6&#xff1f;&#xff1f;&#xff1f; 二&#xff1a;如何正确的计算结构体大小&#xff1f; 首先得掌握结构体的对齐规则&#xff1a; 第一&#xff1a; 第一…

mysql四种事务隔离级别,2024金三银四

TransactionDefinition.PROPAGATION_MANDATORY&#xff1a;如果当前存在事务&#xff0c;则加入该事务&#xff1b;如果当前没有事务&#xff0c;则抛出异常。 TransactionDefinition.PROPAGATION_NESTED&#xff1a;如果当前存在事务&#xff0c;则创建一个事务作为当前事务的…

Eureka的介绍和作用,以及搭建

一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具&#xff0c;它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一&#xff0c;它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…

哪些事是你当了领导才明白的?

哪些事是你当了领导才明白的&#xff1f; 毕业5年&#xff0c;17年开始带团队&#xff0c;确实很多事不做到管理这一层&#xff0c;就真的意识不到。 带着【执行者】和【管理者】这2个视角&#xff0c;再结合我毕业至今这5年的所有职场经历&#xff0c;聊聊“职场潜规则”。 …

2023最新版Node.js下载安装及环境配置教程(非常详细)从零基础入门到精通,看完这一篇就够了

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序 &…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁&#xff0c;必须要求 Redis 有「互斥」的能力&#xff0c;我们可以使用 SETNX 命令&#xff0c;这个命令表示SET if Not Exists&#xff0c;即如果 key 不存在&#xff0c;才会设置它的值&#xff0c;否则什么也不做。 …

MQTTnet实现客户端连接

使用MQTTnet&#xff08;Version4.3.1.873&#xff09;库实现多客户端连接多服务端&#xff0c;同时实现断线重连&#xff1b; 如下图所示&#xff0c;开启3个客户端连接3个服务端&#xff0c;当其一个服务端出现异常(服务停止&#xff0c;网络异常无法连接)导致连接断开时&am…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 通过增加容量或提前停止来提高性能。 在深度学习中&#…

oracle 19c单机版本补丁升级

文章目录 一、补丁包概述二、备份opatch三、替换高版本opatch四、打DB补丁1、关闭数据库2、关闭监听3、解压补丁4、冲突检测5、补丁空间检查6、执行补丁升级7、将更新内容加载到数据库8、最后查看数据库版本9、卸载补丁包 一、补丁包概述 补丁升级包 链接&#xff1a;https://…

Vue3的与2的简单区别

Vue2选项式api Vue3组合式API setup方法的使用&#xff0c;最后需要return setup语法糖省略了内部的export default{} 和return 内容 以及组件的注册 reactive生成响应式对象&#xff0c;只能适用于复杂对象&#xff0c;简单类型不可 ref生成响应式数据&#xff1a;复杂类型和简…

学习人工智能:Attention Is All You Need-1-介绍;Transformer模型架构

Transformer模型是目前最成功的chatGPT&#xff0c;Sora&#xff0c;文心一言&#xff0c;LLama&#xff0c;Grok的基础模型。 《Attention Is All You Need》是一篇由Google DeepMind团队在2017年发表的论文&#xff0c;该论文提出了一种新的神经网络模型&#xff0c;即Trans…

十七 超级数据查看器 讲解稿 条目内容

十七 超级数据查看器 讲解稿 条目内容 ​​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;今天我们讲解超级数据查看器条目内容设置 条目内容设置能够 设置条目的顺序 显示隐藏 标题 需要下载本系统的…

OpenLayers基础教程——使用WebGL加载海量数据(1)

1、前言 最近遇到一个问题&#xff1a;如何在OpenLayers中高效加载海量的场强点&#xff1f;由于项目中的一些要求&#xff0c;不能使用聚合的方法加载。一番搜索之后发现&#xff1a;OpenLayers中有一个WebGLPoints类&#xff0c;使用该类可以轻松应对几十万的数据量&#xf…

SAP Business Application Studio(BAS)中开发Fiori App的基础知识

1. SAP Fiori Tools SAP Fiori Tools是一套用于支持SAP Fiori应用开发的工具&#xff0c;包括应用模板、可视化编辑器、代码生成、应用预览和集成测试工具等。这些工具可以帮助开发者更快速、更简单地创建和维护SAP Fiori应用。SAP Fiori Tools 可与SAP的开发环境&#xff08;…

Qt 不同数据类型转换

一.不同类型数据转换示例&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QJsonDocument> #include <QJsonObject> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication::setAttribute…

用OceanBase binlog service 轻松进行数据回滚

背景 在日常的数据库运维过程中&#xff0c;难免会遭遇数据误操作的情形&#xff0c;比如因疏忽而执行了非预期的delete或update操作&#xff0c;这时就需要进行数据回滚。如果在OceanBase中启用了回收站功能&#xff0c;并设置了合适的undo_retention&#xff0c;那么我们可以…

【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关)

&#x1f6eb; 系列文章导航 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580【Frida】 01_食用指南 https://blog.csdn.net/kinghzking/article/details/126849567【Frida】02_常见API示例及功能函数封装&#xff08;snippets&#…

【爬虫】web自动化和接口自动化

专栏文章索引&#xff1a;爬虫 目录 一、介绍 二、推荐 1.接口自动化 2.Web自动化 一、介绍 爬虫技术一般可以分为两种类型&#xff1a;接口自动化和web自动化。下面是它们的简要介绍&#xff1a; 1.接口自动化 接口自动化技术的主要目的是通过模拟HTTP请求来实现自动化…

如何在Linux系统部署Dupal CMS结合内网穿透实现无公网IP访问web界面

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&a…

十九、软考-系统架构设计师笔记-真题解析-2021年真题

软考-系统架构设计师-2021年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为&#xff1a;→(Pi,Pj)Pi must Complete Before Pj may strat), 假设系统中进程P{P1, P2,P3,P4, P5, P6, P7, P8}&#xff0c; 且进程的…