.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. 在K8S集群中使用busybox-dig镜像,来作DNS解析分析

    以前,判断K8S里的DNS功能是否正常时,得想很多办法. 如果有了busybox-dig镜像,则作这事就简单多了. 如下命令,直接部署 kubectl run busybox -it --image= ...

  2. 201871010106-丁宣元 《2019面向对象程序设计(java)课程学习进度条》

    <2019面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 25/10 ...

  3. vue大文件上传控件选哪个好?

    需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...

  4. vue之子父组件通信

    一. 子-父组件间通信: let children = {    # 定义子组件 template: `<div> <button @click="send"&g ...

  5. CF1174E Ehab and the Expected GCD Problem(DP,数论)

    题目大意:对于一个序列,定义它的价值是它的所有前缀的 $\gcd$ 中互不相同的数的个数.给定整数 $n$,问在 $1$ 到 $n$ 的排列中,有多少个排列的价值达到最大值.答案对 $10^9+7$ ...

  6. 第08组 Beta冲刺(3/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ? 维持进度,检查需求 展示GitHub当日代码/文档签入记录 接下来的 ...

  7. helm repository 相关

    chart repo是一个可用来存储index.yaml与打包的chart文件的HTTP server.当要分享chart时,需要上传chart文件到chart仓库,任何一个能够提供yaml与tar文 ...

  8. JS中 (function(){...})()立即执行函数

    (function(){...})() (function(){...}()) 这是两种js立即执行函数的常见写法. 基本概念: 函数声明:function fname(){...}; 使用funct ...

  9. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  10. Certification information不能过大

    /* If certification information is too big this event can't be transmitted as it would cause failure ...