百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

dotNet开发之反射技术详解(动态库的加载)

haoteby 2025-06-23 19:09 21 浏览

在上一篇文章中dotNet开发之反射技术详解(基础篇),我们简要介绍了.NET开发中的反射技术。反射是一种强大的工具,它允许程序在运行时获取关于类型、成员和程序集的信息,并动态地创建、调用和修改代码。今天,我们将深入探讨反射的其他用法,以帮助您更好地利用这一技术。

一、Assembly.Load(),Assembly.LoadFrom(),Assembly.LoadFile()的区别

1.Assembly.Load

  • Assembly.Load(string assemblyString):通过程序集的完全限定名称(包括版本号、公钥令牌等)或者简单名称来加载程序集。例如:Assembly.Load("MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")Assembly.Load("MyAssembly")
  • Assembly.Load(byte[] rawAssembly):从字节数组中加载程序集。这对于从网络或其他非传统来源加载程序集很有用。

示例用法:

// 根据程序集名称加载程序集
Assembly assembly = Assembly.Load("MyAssembly");

// 从字节数组加载程序集
byte[] assemblyBytes = File.ReadAllBytes("MyAssembly.dll");
Assembly assembly = Assembly.Load(assemblyBytes);

2.Assembly.LoadFrom

  • Assembly.LoadFrom(string assemblyFile):从指定路径加载程序集文件。
  • Assembly.LoadFrom(string assemblyFile, Evidence securityEvidence):基于安全证据加载程序集文件。

示例用法:

// 从文件路径加载程序集
Assembly assembly = Assembly.LoadFrom("C:\\MyAssemblies\\MyAssembly.dll");

// 基于安全证据加载程序集
Evidence evidence = new Evidence();
Assembly assembly = Assembly.LoadFrom("C:\\MyAssemblies\\MyAssembly.dll", evidence);

3.Assembly.LoadFile

  • Assembly.LoadFile(string path):从指定路径加载程序集文件。与LoadFrom不同,它会创建一个新的加载上下文,程序集将在该上下文中加载并解析。

示例用法:

// 从文件路径加载程序集
Assembly assembly = Assembly.LoadFile("C:\\MyAssemblies\\MyAssembly.dll");

二、加载程序集的异常情况

需要注意的是,在使用这些方法加载程序集时,你需要处理可能出现的异常情况以下可能会抛出以下几种异常:

1.FileNotFoundException

  • 当指定的程序集文件无法找到时,会抛出此异常。
  • 可能的原因包括:文件路径错误、文件不存在或不可访问等。

2.FileLoadException

  • 当无法加载指定的程序集文件时,会抛出此异常。
  • 可能的原因包括:无效的程序集文件、程序集版本不兼容、程序集依赖项无法解析等。

3.BadImageFormatException

  • 当尝试加载无效的程序集文件格式时,会抛出此异常。
  • 可能的原因包括:程序集文件不是有效的CLR程序集、程序集文件被损坏或篡改等。

4.SecurityException

  • 当没有足够权限来加载程序集时,会抛出此异常。
  • 可能的原因包括:缺少适当的安全权限、程序集未经数字签名等。

5.ReflectionTypeLoadException

  • 当加载程序集时出现类型加载异常时,会抛出此异常。
  • 可能的原因包括:程序集中某个类型的依赖项无法解析、类型初始化失败等。

6.UnauthorizedAccessException

  • 当没有足够的权限访问程序集文件时,会抛出此异常。
  • 可能的原因包括:访问权限限制、文件被占用或锁定等。

这些异常通常会在使用Assembly.Load()方法加载程序集时的各种错误情况下抛出。为了确保程序的稳定性和可靠性,建议在使用Assembly.Load()方法时使用适当的异常处理机制来捕获和处理这些异常。此外,当使用这些方法加载程序集时,还要注意程序集的版本和依赖关系,确保加载的程序集符合预期,并且不会引发版本冲突或依赖项缺失的问题。

三、DLL加载规则

我相信很多使用反射技术或者不使用反射技术,加载程序集的时候,都曾经遇到过BadImageFormatException的问题。在加载DLL(动态链接库)时,系统会按照一定的路径规则进行搜索。以下是通常情况下的DLL加载路径规则:

  1. 应用程序目录
    系统首先会搜索执行当前代码的应用程序目录。这是最常见的搜索位置,通常会将DLL文件放置在应用程序的根目录或相关子目录中。
  2. 系统目录
    如果在应用程序目录中未找到DLL文件,则系统会搜索系统目录。系统目录通常是指
    %SystemRoot%\System32(在大多数情况下为 C:\Windows\System32)。请注意,32位应用程序在64位操作系统上可能会搜索 %SystemRoot%\SysWOW64 目录。
  3. Windows目录
    如果在系统目录中未找到DLL文件,则系统会搜索Windows目录。Windows目录通常是指
    %SystemRoot%\(在大多数情况下为 C:\Windows)。
  4. 当前工作目录
    如果在以上路径中未找到DLL文件,则系统会搜索当前工作目录。当前工作目录是指应用程序正在运行的目录。
  5. 环境变量指定的路径
    系统还会搜索在系统环境变量
    PATH 中指定的路径。PATH 变量包含一系列目录路径,用于指示系统在其中搜索可执行文件和DLL文件。

请注意,搜索DLL的顺序是按照上述规则从前往后进行的,一旦找到匹配的DLL文件,搜索过程就会停止。此外,还可以使用以下方法来影响DLL的加载路径:

  • 使用绝对路径:指定DLL的完整路径,确保系统可以直接访问该路径下的DLL文件。
  • 使用相对路径:指定相对于应用程序或当前工作目录的相对路径。在这种情况下,需要确保指定的相对路径是正确的。

参考文档

C#反射-Assembly.Load、LoadFrom与LoadFile进阶 - zagelover - 博客园

#跨年幸运签#

#文章首发挑战赛#

#挑战30天在头条写日记#

#自律学习计划#

相关推荐

一日一技:用Python程序将十进制转换为二进制

用Python程序将十进制转换为二进制通过将数字连续除以2并以相反顺序打印其余部分,将十进制数转换为二进制。在下面的程序中,我们将学习使用递归函数将十进制数转换为二进制数,代码如下:...

十进制转化成二进制你会吗?#数学思维

六年级奥赛起跑线:抽屉原理揭秘。同学们好,我是你们的奥耀老师。今天一起来学习奥赛起跑线第三讲二进制计数法。例一:把十进制五十三化成二进制数是多少?首先十进制就是满十进一,二进制就是满二进一。二进制每个...

二进制、十进制、八进制和十六进制,它们之间是如何转换的?

在学习进制时总会遇到多种进制转换的时候,学会它们之间的转换方法也是必须的,这里分享一下几种进制之间转换的方法,也分享两个好用的转换工具,使用它们能够大幅度的提升你的办公和学习效率,感兴趣的小伙伴记得点...

c语言-2进制转10进制_c语言 二进制转十进制

#include<stdio.h>intmain(){charch;inta=0;...

二进制、八进制、十进制和十六进制数制转换

一、数制1、什么是数制数制是计数进位的简称。也就是由低位向高位进位计数的方法。2、常用数制计算机中常用的数制有二进制、八进制、十进制和十六进制。...

二进制、十进制、八进制、十六进制间的相互转换函数

二进制、十进制、八进制、十六进制间的相互转换函数1、输入任意一个十进制的整数,将其分别转换为二进制、八进制、十六进制。2、程序代码如下:#include<iostream>usingna...

二进制、八进制、十进制和十六进制等常用数制及其相互转换

从大学开始系统的接触计算机专业,到现在已经过去十几年了,今天整理一下基础的进制转换,希望给还在上高中的表妹一个入门的引导,早日熟悉这个行业。一、二进制、八进制、十进制和十六进制是如何定义的?二进制是B...

二进制如何转换成十进制?_二进制如何转换成十进制例子图解

随着社会的发展,电器维修由继电器时代逐渐被PLC,变频器,触摸屏等工控时代所替代,特别是plc编程,其数据逻辑往往涉及到数制二进制,那么二进制到底是什么呢?它和十进制又有什么区别和联系呢?下面和朋友们...

二进制与十进制的相互转换_二进制和十进制之间转换

很多同学在刚开始接触计算机语言的时候,都会了解计算机的世界里面大多都是二进制来表达现实世界的任何事物的。当然现实世界的事务有很多很多,就拿最简单的数字,我们经常看到的数字大多都是十进制的形式,例如:我...

十进制如何转换为二进制,二进制如何转换为十进制

用十进制除以2,除的断的,商用0表示;除不断的,商用1表示余0时结束假如十进制用X表示,用十进制除以2,即x/2除以2后为整数的(除的断的),商用0表示;除以2除不断的,商用1表示除完后的商0或1...

十进制数如何转换为二进制数_十进制数如何转换为二进制数举例说明

我们经常听到十进制数和二进制数,电脑中也经常使用二进制数来进行计算,但是很多人却不清楚十进制数和二进制数是怎样进行转换的,下面就来看看,十进制数转换为二进制数的方法。正整数转二进制...

二进制转化为十进制,你会做吗?一起来试试吧

今天孩子问把二进制表示的110101改写成十进制数怎么做呀?,“二进制”简单来说就是“满二进一”,只用0和1共两个数字表示,同理我们平常接触到的“十进制”是“满十进一”,只用0-9共十个数字表示。如果...

Mac终于能正常打游戏了!苹果正逐渐淘汰Rosetta转译

Mac玩家苦转译久矣!WWDC2025苹果正式宣判Rosetta死刑,原生游戏时代终于杀到。Metal4光追和AI插帧技术直接掀桌,连Steam都连夜扛着ARM架构投诚了。看到《赛博朋克2077》...

怎么把视频的声音提出来转为音频?音频提取,11款工具实测搞定

想把视频里的声音单独保存为音频文件(MP3/AAC/WAV/FLAC)用于配音、播客、听课或二次剪辑?本文挑出10款常用工具,给出实测可复现的操作步骤、优缺点和场景推荐。1)转换猫mp3转换器(操作门...

6个mp4格式转换器测评:转换速度与质量并存!

MP4视频格式具有兼容性强、视频画质高清、文件体积较小、支持多种编码等特点,适用于网络媒体传播。如果大家想要将非MP4格式的视频转换成MP4的视频格式的话,可以使用MP4格式转换器更换格式。本文分别从...