.NET CORE 的程序集加载管理和以前的 .NET 发生了很大的变化, 在 .NET CORE 里, 程序集的加载, 依赖了 xx.deps.json 文件, deps.json 文件里,定义了程序所需有的所有程序集以前程序集之间的依赖关系。

所以如果程序集的信息没有定义在 deps.json 文件里, 程序集是不会加载的。

程序集的依赖关系,可以通过 DependencyContext 类来处理, 通过 Load(程序集) 的方式,来获取程序集的依赖信息, 但是这个 DependencyContext 类也是通过加载 deps.json 文件里的程序, 如有个程序集叫 a.dll 文件, 那就就需要定义一个 a.deps.json 文件, 如果没有定义这个文件, 那么 DependencyContext.Load 将返回 null。

下面为一段 System.Data.Odbc 程序集的定义:

"System.Data.Odbc/4.7.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "3.1.0"
},
"runtime": {
"lib/netstandard2.0/System.Data.Odbc.dll": {
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.700.19.56404"
}
},
"runtimeTargets": {
"runtimes/freebsd/lib/netcoreapp2.0/System.Data.Odbc.dll": {
"rid": "freebsd",
"assetType": "runtime",
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.700.19.56404"
},
"runtimes/linux/lib/netcoreapp2.0/System.Data.Odbc.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.700.19.56404"
},
"runtimes/osx/lib/netcoreapp2.0/System.Data.Odbc.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.700.19.56404"
},
"runtimes/win/lib/netcoreapp2.0/System.Data.Odbc.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.700.19.56404"
}
},
"compile": {
"ref/netstandard2.0/System.Data.Odbc.dll": {}
}
}

  

此段定义了 system.data.odbc 程序集的依赖, 以前程序集在每个平台运行的目标程集, 还有编译时的程序集。通过 DependencyContext 都可以获取到这些信息:

CompileLibraries: 编译时的库

RuntimeLibraries:运行时的库

RuntimeLibraries 返回的都是一个 RuntimeLibrary 对象集合, RuntimeLibrary 对象又可以通过 RuntimeAssemblyGroups 属性来获取 runtimeTargets 节点的属性。

奇怪的时 DependencyContext 没有获取依赖库的信息, 通过 CompileLibraries 获取不到依赖的库信息, 上面虽然有定义,但是在测试的时候还是返回为 null。竟然通过 DependencyContext 获取不到引用的程序集, 就通过 Assembly 对象的 GetReferencedAssemblies 方法来获取。

.NET CORE 在加载程序集的时候,只会加载程序集本身, 而不会去加载引用的程序集,而在程序集使用到引用的程序集时, 才会去判断是否有加载, 这个加载过程就是通过 AssemblyLoadContext 的 Resolving 事件来加载, 当 .NET CORE 程序在运行的时候,遇到一个没有加载过的程序集,则会引发 Resolving 事件,这个事件里必须返回一个 Assembly 对象, 如果返回 null 则会提示程序集加载失败。

.NetCore 默认处理了 Resolving 事件,通过入口 程序集的 deps.json 信息来加载, 所以没有在 deps.json 文件中定义的程序集是不会加载的。

可以看一下 AssemblyLoadContext 类的官方文档,文档内容比简单,通过好多测试才明白 Resolving 事件。

https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.loader.assemblyloadcontext?view=netcore-3.0

.Net Core 程序集管理说明(加载)的更多相关文章

  1. .Net Core利用反射动态加载类库的方法(解决类库不包含Nuget依赖包的问题)

    在.Net Framework时代,生成类库只需将类库项目编译好,然后拷贝到其他项目,即可引用或动态加载,相对来说,比较简单.但到了.Net Core时代,动态加载第三方类库,则稍微麻烦一些. 一.类 ...

  2. 非常郁闷的 .NET中程序集的动态加载

    记载这篇文章的原因是我自己遇到了动态加载程序集的问题,而困扰了一天之久. 最终看到了这篇博客:http://www.cnblogs.com/brucebi/archive/2013/05/22/Ass ...

  3. .Net 程序集按需加载机制

    在开始本文之前先提两个疑问: 1.一个.Net程序依赖很多的dll,那个他们是在应用程序启动的时候全部把所依赖的动态库全部都加载到应用程序域中的呢还是有选择的加载呢? 2.当应用程序已经启动后我们动态 ...

  4. .Net 有关程序集查找与加载的一点反思

    最近在做一款叫VICA产品,此产品采用了插件机制,插件在运行中加载,插件与插件之间存在依赖关系,所有的插件DLL为方便管理都放置在Plugins的文件夹下统一管理.这种处理方式不自觉的就让我想了解cl ...

  5. .net core 深入了解配置文件加载过程

    前言     配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...

  6. Assetbundle管理与加载

    最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开 ...

  7. vue后端返回路由表来进行权限管理,加载指定路由结构,不包含则不加载

    创建vue项目,配置环境变量,后续需要用到.这里只配置生产环境和开发环境. 项目根目录创建 .env.production 文件 NODE_ENV=production VUE_APP_URL=htt ...

  8. 未能从程序集“Oracle.ManagedDataAccess”加载 “OracleInternal.Common.ConfigBaseClass”

    使用VS2015做项目的过程中一直使用的服务器上的oracle数据库,后来想学习一下oracle,就在本机安装了oracle.可没想到本来运行好好的项目,现在不能运行了.项目是使用的Abp框架,当运行 ...

  9. .NET Core 3.0 可回收程序集加载上下文

    一.前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API, ...

随机推荐

  1. Python面试题(2)

    1.一行代码实现1-100的和 ? 1 2 3 print(sum(range(1,101))) #range中的参数是1<=i<101 #sum是计算参数的和 2.在函数内部改变全局变量 ...

  2. 201871010121 王方 《面向对象程序设计(java)》 第二周学习总结

    这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11475 ...

  3. wordpress后台添加左侧边栏菜单如何操作

    我们有时为了方便操作会把一些特定的链接添加到wordpress后台左侧菜单栏中,这个要如何实现呢?其实不会很难,使用两个WordPress内置函数就可以解决问题,分别是add_menu_page()和 ...

  4. woocommerce隐藏breadcrumb面包屑导航

    woocommerce已经集成比较完善的组件,当然也包含breadcrumb面包屑导航,但是我们如果调整一下breadcrumb的位置要如何操作呢?首先要先把woocommerce隐藏breadcru ...

  5. Django Model的外键自关联‘self'和设置'unique_together'

    在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(super_department),上级部门 ...

  6. Java 基本类型、封装类型、常量池、基本运算

    基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~3 ...

  7. Pandas | 08 重建索引

    重新索引会更改DataFrame的行标签和列标签. 可以通过索引来实现多个操作: 重新排序现有数据以匹配一组新的标签. 在没有标签数据的标签位置插入缺失值(NA)标记. import pandas a ...

  8. 你好,我叫Flask

    首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...

  9. Jmeter实现压力测试(多并发测试)

    一.http://jmeter.apache.org/ 二.点击Download Releases选择版本下载 三.下载解压: 将解压后的文档存盘-下载logkit-2.0.jar(汉化包)放到jme ...

  10. Spring Boot进阶系列三

    Thymeleaf是官方推荐的显示引擎,这篇文章主要介绍怎么让spring boot整合Thymeleaf.  它是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要 ...