C#程序集加载方法

.NET 动态加载类库的方法 1、创建一类库,名为“ClassLibrary1”,代码如下: ClassLibrary1 阅读详情

 原文: http://blog.youkuaiyun.com/podded/archive/2008/10/27/3158687.aspx

 

 要从程序集的元数据中获取程序集的信息,首先需要加载程序集。.Net中加载程序集方法有几种,本人结合自己的实践和认识简单介绍一下。描述不一定很准确,请提出来一起进步。

一、隐式加载
        没有被显式加载但被引用的程序集,CLR会按照全局程序集缓存(GAC)、工作目录(应用程序所在目录)以及私有路径目录的顺序来寻找并加载。

二、AppDomain.Load 方法
    将一个程序集加载到一个特定的程序域中,主要用来供非托管代码调用。

三、Assembly.Load方法
    通过接受一个程序集标识来加载程序集。如果是强命名程序集,则标识包括程序集名称、版本、语言文化、以及公有密钥标记,Load方法将导致CLR按照隐式加载的策略寻找并加载程序集。弱命名程序集则只是一个不带文件扩展名的程序集的名称,CLR不会到GAC中查找,如果没有指定私有目录,则在工作目录查找,如Assembly.Load("Math")。其中私有目录的定义可以在配置文件中指定。如应用程序MyApp.exe的配置文件可以定义为MyApp.exe.config。内容:
    

 <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <probing privatePath="App;App1;" />
          </assemblyBinding>
       </runtime>
    </configuration>

  

     其中App和App1是两个在工作目录下的目录,用probing定义,存放需要在这个目录下被加载的程序集。如果使用工作目录以外的目录下的程序集,则可以使用codeBase元素来定义,可以在MSDN上查找其属性内容。

四、Assembly.LoadFrom方法
    参数是包括程序集清单的文件的名称或路径,包括文件扩展名。如需要加载D:/App/math.dll,可以使用语句:
    Assembly a = Assembly.LoadFrom(@"D:/App/math.dll");
    a即是加载的程序集。
    但这种方法有缺点,在MSDN上有详细的描述,我自己遇到的一个问题是加载一个在非工作目录下的程序集后,在另一个程序集中使用这个程序集中的对象进行反序列化时失败。使用Assembly.Load方法或者将该程序集放在工作目录下后问题得以解决。

五、Assembly.LoadFile方法
    用来加载指定路径上的程序集文件的内容。使用 LoadFile 方法来加载和检查具有相同标识但位于不同路径中的程序集。与 LoadFrom 不同,LoadFile 不会将文件加载到 LoadFrom 上下文中,也不会使用加载路径解析依赖项。LoadFile 在这个受限制的方案中很有用,因为 LoadFrom 不能用于加载标识相同但路径不同的程序集;它只加载第一个这样的程序集。

六、Assembly.LoadWithPartialName方法
    使用部分名称从应用程序目录或从全局程序集缓存加载程序集。参数为程序集标识,其中包含程序集的名称(不带文件扩展名)。程序集的版本、语言文化及公用密钥标记为可选。该方法执行时CLR首先检查应用程序的XML配置文件来搜索qualifyAssembly元素,若存在则该元素应能告诉CLR如何将一个部分的程序集标识映射为完全限定的标识,CRL将根据通常规则来查找程序集。若该元素不存在,CRL将使用指定名称在应用程序的工作目录和私有路径目录中搜索。若仍未找到,则到GAC中查找。

七、传统VC动态库的调用
    通过 P/Invoke 调用Win32 DLL

    using System.Runtime.InteropServices;//这是用到DllImport时候要引入的程序集

    [DllImport("DBAccess.dll",CharSet=CharSet.Auto)]
    static extern ulong FindApp( bool bIsTrue );
    //声明外部的标准动态库,跟Win32API是一样的.

在VS2022环境下用C#编写DLL动态链接库并在项目中调用 在VS2022环境下用C#语言编写DLL动态链接库并在项目中调用自己写的库,以(.Net Framework)控制台应用为例。 阅读详情

相关推荐

C#动态加载程序集全攻略

C#动态加载程序集指南 本文详解C#动态加载程序集的三种核心方法: Assembly.Load:通过名称加载,自动处理依赖 LoadFrom:通过路径加载,适合常规插件场景 LoadFile:严格路径加载,需手动处理依赖 提供完整实现流程:从程序集加载→类型实例化→方法调用→依赖解析(含AssemblyResolve事件处理),覆盖插件系统、模块化开发等典型场景。强调安全性(沙箱隔离)、性能优化(反射缓存)和资源卸载(AppDomain级)等实践要点,附完整示例代码实现动态DLL加载与调用。

java专栏 825

怎么用c语言编写dll动态库,WPF调用dll - 用C语言编写动态库

概述用C语言编写一套接口供C#调动,实现:malloc一块内存内存,通过参数初始化内存,并返回cdll_t句柄打印cdll_t内存中数据freecdll_t内存接口函数这里我们用到了struct来管理开辟的内存关于性别的枚举:typedef struct{bool sports; /* whether be qualified or not */uin...

weixin_42530536的博客 455

C# WPF上位机开发(动态库dll的开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多时候,我们并不希望所有的程序都放到一个exe里面。因为这样相当于把所有的风险都放在了一个文件里里面,既不利于程序的升级,也不利于程序的模块化切割和复用。回到c#,它和单纯的c/c++又不太一样,因为它的dll有两种形式,一种是c#生成的dll,另外一种就是非c#生成的dll。

嵌入式-老费,一个分享专业嵌入式知识的blog 2493

C#利用反射来加载程序集,并调用程序集中有关类的方法

此文章来自博客园,因为原文已经打不开,我是在百度快照中看到的,所以贴在这里做个备份。 -------------------------------------------------------------------------------------------------------------------------------------- 假设在C盘根目录下有个Dog的Dll程序

friendan的专栏 1646

LDA模型中文文本主题提取丨可视化工具pyLDAvis的使用

主题模型LDA的实现及其可视化pyLDAvis1. 无监督提取文档主题——LDA模型1.1 准备工作1.2 调用api实现模型2. LDA的可视化交互分析——pyLDAvis2.1 安装pyLDAvis2.2 结合gensim调用api实现可视化p.s. 保存结果为独立网页p.p.s. 加快prepare速度?2.3 如何分析pyLDAvis可视化结果2.3.1. **每个主题表示什么意义?**2.3.2 每个主题有多么普遍?2.3.3 主题之间有什么关联? 1. 无监督提取文档主题——LDA模型 这个模型

qq_39496504的博客 6万+

MATLAB去雾算法实战:5种经典方法对比+1种改进方案(附完整源码)

本文详细对比了MATLAB中5种经典去雾算法(包括暗通道先验、多尺度Retinex等)的实现效果,并提出一种创新的自适应融合改进方案。通过完整的源码展示和性能对比,帮助开发者掌握图像去雾的核心技术,提升计算机视觉应用中的图像质量。特别针对去雾算法中的光晕效应问题,给出了工程实践中的优化技巧。

weixin_26801149的博客 412

C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

被引用的项目生成的目标平台是x86,而项目本身是AnyCPU。因此,两者的不一致导致异常的出现。其解决办法如下:将引用的项目与本项目改为相同的生成目标平台(建议X86)项目->属性->生成->目标平台->x64(与dll平台一致)试图加载格式不正确的程序。

weixin_52475977的博客 6156

Transformers在自动驾驶领域的应用(High-level like in scene)

Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn

qq_39337332的博客 1775

c语言中对文件的引用程序集,C#使用反射加载多个程序集的实现方法

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。创建一个控制台应用程序,首先设计一个接口:public interface ISay{void SaySth();}在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里。右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹。创建类库项目Assembly...

weixin_26900991的博客 351

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器

基于多物理参数数据融合和先进人工智能算法的锂电池热失控监测传感器是多种方案中的优选项!是一种快速、准确、可靠、应用广泛的传感方案!可有效监测锂离子电池热失控风险,保障化学能储能电站安全!

chicheng_danxin的博客 2412

c#程序集加载方法

一、隐式加载 没有被显式加载但被引用的程序集,CLR会按照全局程序集缓存(GAC)、工作目录(应用程序所在目录)以及私有路径目录的顺序来寻找并加载。 二、AppDomain.Load 方法 将一个程序集加载到一个特定的程序域中,主要用来供非托管代码调用。 三、Assembly.Load方法 通过接受一个程序集标识来加载程序集。如果是强命名程序集,则标识包括...

weixin_30632089的博客 329

【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?

本文介绍了Halcon中为XLD轮廓模板添加极性信息的实用技巧。通过先以"ignore_local_polarity"模式创建模板,首次匹配获得位置后,使用set_shape_model_metric运算符结合真实图像为模板注入极性信息(边缘明暗方向)。这种方法弥补了XLD模板初始不支持极性的缺陷,可显著提升后续匹配的精度和抗干扰能力。实验显示,添加极性信息后的模板匹配效果明显优于无极性的匹配结果。该技术特别适用于基于手动绘制或处理后的XLD轮廓创建模板的场景。

songhuangong123的博客 750

C# 宿主程序加载插件程序集的方法

宿主程序加载插件有3种方法:即Assembly.Load 方法、Assembly.LoadFile 方法、及Assembly.LoadForm 方法

qq_27474555的博客 713

YOLOv12改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例

本文记录的是。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。

Limiiiing的博客 2906

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1262

C# 如何利用反射来加载程序集,并调用程序集中有关类的方法

假设在C盘根目录下有个Dog的Dll程序集文件,该程序集文件中包含类Dog 该类中有个狗叫几声的方法,如何通过反射来加载这个C:\Dog.dll,并且调用Dog类里面的Sound方法呢: public class Dog {      public void Sound(int count)     { Console.WriteLine("叫了{0}声",count); } } 具体...

weixin_33816946的博客 349

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于C#未能从程序集XXX加载XXX类型问题的解决方法

错误描述: 在最近自己写的一个查询成绩的小程序中,编写了一个成绩查询的类库,然后编译成Dll文件。 在WinForm程序里引用这个Dll库,但是总是出现“未能程序集XXX加载XXX类型问题”。 而在另一个控制台程序测试没问题,所以不可能是本身类库代码出现什么错误。 网上查阅资料,有说版本问题,有说要复制到Debug目录下,但是都不对。 解决方法: 原因是类库的程序集名称(我的是

张Da夫 8631

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# 动态加载卸载程序集

C# 动态加载卸载程序集

力先生C#程序开发 4036

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C#怎么实现动态加载DLL C#如何在运行时动态加载和卸载程序集调用其中的方法【进阶】

AssemblyLoadContext(ALC)是.NET Core/.NET 5+中唯一可卸载程序集的机制,需创建isCollectible=true的非默认ALC,通过其LoadFromAssemblyPath加载,并用委托或ExecuteInLoadContext跨上下文调用,卸载前须清除所有引用并确保无后台线程或事件残留。

qq_65436698的博客 234

C#动态加载DLL程序集及使用反射创建实例-简记

Assembly动态加载程序集: 分两种情况: 1、需要加载的程序集已经在程序中被引用了,则直接从当前程序域中查找即可: Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name.Contains("theAssemblyName")); 2、需要加载的程序集未被加载,则使用程序集名称加载: 方法一,需要具体程序集的一些必要信息,如下: Ass..

zp19860529的博客 3554
上一篇: 如何用代码打开系统的“运行”对话框
下一篇: WPF学习心得(1)——资源
CsToD
博客等级 码龄19年 91粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值