以下意外的行为列表照抄自文档 Best Practices for Assembly Loading: 如果已加载一个具有相同标识的程序集,则即使指定了不同的路径,LoadFrom 仍返回已加载的程序集...如果用 LoadFrom 加载一个程序集,并且探测路径包括一个具有相同标识但位置不同的程序集,则将发生 InvalidCastException、MissingMethodException 或其他意外行为...无上下文 使用反射发出生成的瞬态程序集只能选择在没有下文的情况下进行加载。在没有上下文的情况下进行加载是将具有同一标识的多个程序集加载到一个应用程序域中的唯一方式。这将省去探测成本。...从字节数组加载的程序集都是在没有上下文的情况下加载的,除非程序集的标识(在应用策略后建立)与全局程序集缓存中的程序集标识匹配;在此情况下,将会从全局程序集缓存加载程序集。...在没有上下文的情况下加载具有同一标识的多个程序集会导致出现类型标识问题,这些问题与将具有同一标识的多个程序集加载到多个上下文中所导致的问题类似。 请参阅避免将一个程序集加载到多个上下文中。
程序集的文件名、版本、语言文化和签名的公钥令牌共同组成了它的唯一标识,我们将该标识称为程序集有效名称(Assembly Qualified Name)。...如果当前引用的是一个Retargetable程序集,则意味着CLR在定位目标程序集的时候可以 “放宽” 匹配的要求,即指要求目标程序集具有相同的文件名即可。...其实Framework 2.0、3.0和3.5不仅仅共享相同的运行时(CLR 2.0),对于提供基础类型的核心程序集mscorlib.dll也是共享的,下图输出的版本信息已经说明了这一点。...我们利用Visual Studio创建了如下图所示的解决方案,它演示了这样一个场景:控制台应用使用到了V1版本的类库Lib(v1\Lib),其中涉及到一个核心类型Foobar。...比如说所有的目标框架都包含一个核心的程序集mscorlib.dll,虽然定义其中的类型及其成员在各个目标框架不尽相同,但是它们之间肯定存在交集,微软针对不同的目标框架组合将这些交集提取出来并定义在一系列同名程序集中
由于已存在 .NET Core,因此应用在 .NET Core 安装程序间也是可移植的。 应用仅包含其自己的代码和任何位于 .NET Core 库外的第三方依赖项。...可以选择不将其与应用程序的文件一起分布。 但是,如果要调试应用的发布版本,则应保存该文件。 可以采用任何喜欢的方式部署完整的应用程序文件集。...因为依赖项在发布时已从本地 NuGet 缓存解析出来,因此它一定适用于你的系统。 请注意,如果依赖框架的部署具有第三方依赖项,则其可移植性只与第三方依赖项相同。...当为具有此类第三方依赖项的应用程序创建 FDD 时,已发布的输出会针对每个本机依赖项支持(存在于 NuGet 包中)的运行时标识符 (RID) 包含一个文件夹。...请注意,每个子目录中都包含完整的启动应用所需的文件集(既有应用文件,也有所有 .NET Core 文件)。 与应用程序的文件一样,发布过程将生成包含应用调试信息的程序数据库 (.pdb) 文件。
从 .NET Framework 4 开始,公共语言运行时支持将 COM 类型的类型信息直接嵌入到托管程序集中,而不要求托管程序集从互操作程序集中获取 COM 类型的类型信息。...由于嵌入式类型信息仅包含托管程序集实际使用的类型和成员,因此两个托管程序集可能具有相同 COM 类型的不同视图。 每个托管程序集都有不同的 Type 对象来表示其 COM 类型视图。...类型具有相同标识,如下节所述。 两种类型都符合类型等效性,如针对类型等效性标记 COM 类型部分所述。...类型标识 范围和标识匹配时,确定两种类型具有相同标识,换句话说,如果它们各自具有 TypeIdentifierAttribute 属性,并且两个属性都具有匹配的 Scope 和 Identifier 属性...如果定义了其程序集具有 ImportedFromTypeLibAttribute 属性,则接口、结构、枚举或委托是 COM 导入类型。
ASP.NET 程序集应该是 Web 服务器的非常薄的存根,从主机中抽象出应用程序。此 ASP.NET 程序集应特定于主机,并引用实现各个组件(如控制器、模型、数据库访问等)的下游库。...该处理程序将传入的转换为与主机无关的等效对象,该对象将传递到下游程序集,这些程序集使用该对象读取传入的请求并写入响应。...将依赖项作为单独的控制台应用程序或与 .NET Framework 一起运行的后台服务运行。...现在,你的服务可以在 ASP.NET Core 中运行,而控制台应用程序或后台服务可以在 .NET Framework 中运行。...目前,我们仍然将一个控制台应用程序作为 .NET Framework 运行,并使用兼容性填充程序在服务中加载一个 .NET Framework 程序集。
“dotnet”应用主机,用于启动 .NET Core 应用。 它选择运行时并托管运行时,提供程序集加载策略来启动应用。 同一主机还可用于以大致相同的方式启动 SDK 工具。...工作负载 就本身而言,.NET Core 包括单个应用程序模型(控制台应用),这对工具、本地服务和基于文本的游戏很有用。...包 .NET Core 包包含 .NET Core 运行时和库(引用程序集和实现)。 例如,System.Net.Http。...API -- .NET Core 包含很多与 .NET Framework 相同,但数量较少的 API,并且具有不同的组成要素(程序集名称不同;关键用例中的类型形状不同)。...而 .NET Core 不支持这些内容。 API -- Mono 使用相同程序集名称和组成要素支持 .NET Framework API 的 大型子集。
Windows 平台 (UWP) 游戏 物联网 (IoT) 机器学习 控制台应用程序 视窗服务 使用类库在不同的应用程序和应用程序类型之间共享功能。...使用 .NET,无论您正在构建哪种类型的应用程序,您的代码和项目文件的外观和感觉都相同。您可以使用每个应用程序访问相同的运行时、API 和语言功能。...项目文件(.csproj、.fsproj或.vbproj)指定负责编译、打包和发布代码的目标和相关任务。有一些 SDK 标识符指的是目标和任务的标准集合。使用这些标识符有助于保持项目文件小且易于使用。...例如,这是一个控制台应用程序的项目文件: XML 复制 NET.Sdk"> Exe...具有共享代码的开发人员创建包并将它们发布到nuget.org或私有主机。想要使用共享代码的开发人员将一个包添加到他们的项目中,然后可以在他们的项目代码中调用该包公开的 API。
我们可以使用命令提示符来验证相同的内容,即是否已安装.NET CLI。要进行验证,请打开命令提示符(Windows),终端(Linux)并键入“ dotnet”,然后按Enter,如下所示。...: Store the specified assemblies in the runtime package store(将指定的程序集存储在运行时程序包存储中). test: Run unit tests....NET Core控制台应用程序。...,它将显示基于机器上安装的.NET Core版本的可用模板列表,如下图所示: 示例:使用.NET Core CLI创建控制台应用程序 以下命令在当前目录中创建一个与当前目录同名的新控制台项目。...使用 .NET 核心 CLI 命令生成项目 为了构建一个新的或现有的项目,我们需要使用以下“ dotnet build”命令来构建您的.NET Core项目:
.NET Framework 2.0编译生成的程序集)直接运行App.exe,我们会在控制台上得到如下所示的输出结果,可以看到三个程序集的版本编程了4.0.0.0。...,它们的版本和公钥令牌与编译时引用的程序集均不相同。...Lib2和Lib3编译生成代表框架升级之后的两个程序集,我们通过修改项目属性将目标程序集名称设置成Lib和Lib2,Lib2具有针对Lib3的项目引用。...比如说所有的.NET Framework平台都包含一个核心的程序集mscorelib.dll,虽然定义其中的类型及其成员在各个.NET Framework平台不尽相同,但是它们之间肯定存在交集,微软针对不同的...由于所有引用的程序集是根据我们选择的.NET Framework平台“度身定制”的,所以定义在PCL项目的代码才具有可移植的能力。
Razor组件在HTML中是完全呈现的。 Razor类库中的Razor组件 现在可以将Razor组件添加到Razor类库中,并使用Razor组件从ASP.NET核心项目引用它们。...运行时验证 对运行时编译的支持已从.NET Core 3.0中的ASP.NET核心共享框架中删除,但现在可以通过向应用程序添加包的方式来启用它。...ASP.NET Core应用程序包括已配置的Identity Server实例,可是让Angular应用程序很方面的对用户进行身份验证,并针对ASP.NET Core应用程序中的受保护资源发送HTTP请求...Angular模块所构建的身份验证和授权支持,可以导入到您的应用程序中,并提供一套组件和服务来增强主应用程序模块的功能。...这些模板创建了两个项目:一个是托管于ASP. NET Core中的gRPC服务,以及一个用于测试它的控制台应用程序。 ?
推荐序 本书较完整地介绍使用 ASP.NET Core 进行微服务开发时的思路、步骤和工具,书中用大量篇幅讲述关于开发功能强大且具有高可伸缩性和韧性的微服务思想,关注使用 ASP .NET Core 实现云原生模式...CoreFX: 一系列模块化程序集,以 NuGet 包方式提供,并且完全开源,可通过 GitHub 获取。...开发控制台应用 $ dotnet new console $ dotnet restore $ dotnet run 项目创建完成后,运行 dotnet restore 可分析项目的依赖,并下载所有需要的包...开发第一个 ASP.NET Core 应用 往控制台应用添加 ASP.NET Core 功能步骤: 添加 ASP.NET 包 添加 Kestrel 服务器 添加启动类和中间件 第 2 章 持续交付 相对于传统的单体应用...,构建过程不是在已安装好 .NET Core 的专用 Docker 镜像中运行,我们需要使用诸如 apt-get 的工具来安装 .NET 工具链。
利用ildasm.exe打开这个控制台应用编译后生成的程序集之后,我们会发现它具有如下这两个程序集的应用。...(4.7)和.NET Core(2.0)的控制台程序,而NetLib则是针对.NET Framework的类库项目,该项目定义的API将在NetApp和NetCoreApp被调用。...由于NetApp和NetCoreApp这两个控制台应用使用的都是同一个针对.NET Framework编译的程序集NetLib.dll,所以我们先利用反编译工具ildasm.exe查看一下它具有怎样的程序集引用...如下图所示,这个名为NetStandard.Library的NuGet包具有一个核心的程序集netstandard.dll,上面我们所说的.NET Standard API就定义在该程序集中。 ?...也就是说,所有.NET Standard 2.0项目都具有针对程序集netstandard.dll的依赖,这个依赖自然也会体现在编译后生成的程序集上。
当我们谈论.NET Core 平台时,事情很快变得比较复杂,在这里,我只引用官方文档: .NET Core 运行时:类型系统,程序集加载,垃圾收集器,本机互操作和其他基本服务。...它选择并托管运行时,提供程序集加载策略并启动应用程序和工具。 以上内容总结: 运行时,可以通过执行.NET Core 的二进制文件。...在众所周知的程序教程中,首先创建一个控制台应用程序:显示 Hello World!。...要获得可在具有.NET Core 运行时(此处为 2.2 版)的任何环境中部署的应用程序的发行版,只需按如下方式发布应用程序: dotnet publish -c Release -o dist 生成的....Build() .Run(); } } } 您可以使用与上面相同的命令来运行和构建应用程序: dotnet run 现在打开你的浏览器,转到 http
等,这些第三方工具各不相同,但功能大体都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动或手动来通过接口来获得相应实现类的实例,对象实例化的工作由IOC容器自动完成。...让应用程序与扩展程序之间不产生直接的依赖,这样也允许在多个具有同样的扩展需求之间共享扩展程序。...为了使导入与导出匹配,导入和导出必须具有相同的协定。 假设有一个类MyClass,它声明了可以导入插件的类型是IMyAddin。...发现部件 MEF提供三种方式发现部件 AssemblyCatalog 在当前程序集发现部件。 DirectoryCatalog 在指定的目录发现部件。...HelloWordB.cs 该文件先不用看,下面用到了在做说明 3、 METTest1项先不管,下面用到了在做说明 4、 MEFConsoleApplication 该项目为控制台项目
如果创建一个VB.NET类型的项目,实现和上面C#项目完全一样的功能,那么编译后生成的文件有什么区别? 编写控制台应用程序,将字符输出到屏幕,需要调用Console.WriteLine()方法。...为了进一步了解程序集,我们再来做一个试验,使用VB.NET创建一个控制台应用程序项目(ConsoleAppVB),并生成一个程序集,代码功能和上面用C#创建的项目是一样的的。...方法体的CIL语言描述(C#) 至此,可以得到一个初步的推断:不管是VB.NET还是是C#,编译之后的程序集都能够用IL DASM打开,因此它们生成的程序集的格式都是相同的;当程序所实现的功能相同时,程序集所包含的...首先,程序集包含一个清单(manifest),这个清单相当于一个目录,描述了程序集本身的信息,例如程序集标识(名称、版本、文化)、程序集包含的资源(Resources)、组成程序集的文件等。 ?...这个库文件是.NET框架的核心组件之一,注意它也不是一个程序集。MsCorEE.dll位于C:\%SystemRoot%\System32\系统文件夹下所有安装了.NET框架的计算机都会有这个文件。
如何在编译时加载两个相同的程序集 如何同时调用两个两个相同命名空间和类型的程序集?...强名称程序集是具有唯一标识性的程序集,并且可以通过对比哈希值来比较程序集是否被篡改,不过仍然有很多手段和软件可以去掉程序集的签名。...举个例子: 我有一个控制台程序,其路径为D:\Demo\Debug\demo.exe,通过该程序的元数据得知,其引用了一个程序集名称为aa的普通程序集,引用了一个名为bb的强名称程序集,该bb.dll的强名称标识为...这些平台级的标识更多的是和操作系统用户有关,而我们项目代码中的标识则是和在数据库中注册的用户有关, 大家都是通过if else来去判断,判断的主体和格局不一样,逻辑本质都是相同的。...我们用vs新建一个控制台项目,然后对项目右键属性打开项目属性,在应用程序页我们可以定义:程序集名称(生成出来的程序集以程序集名称作为文件名,相当于csc中的/out)、默认命名空间(每次新建类里面显示的命名空间
强名称程序集是具有唯一标识性的程序集,并且可以通过对比哈希值来比较程序集是否被篡改,不过仍然有很多手段和软件可以去掉程序集的签名。...需要值得注意的一点是:当你试图在已生成好的强名称程序集中引用弱名称程序集,那么你必须对弱名称程序集进行签名并在强名称程序集中重新注册。...强名称程序集是先找到与程序集名称(VS中对项目右键属性应用程序->程序集名称)相等的文件名称,然后 按照唯一标识再来确认,确认后CLR加载程序集,同时会通过公钥效验该签名来验证程序集是否被篡改...这些平台级的标识更多的是和操作系统用户有关,而我们项目代码中的标识则是和在数据库中注册的用户有关, 大家都是通过if else来去判断,判断的主体和格局不一样,逻辑本质都是相同的。...我们用vs新建一个控制台项目,然后对项目右键属性打开项目属性,在应用程序页我们可以定义:程序集名称(生成出来的程序集以程序集名称作为文件名,相当于csc中的/out)、默认命名空间(每次新建类里面显示的命名空间
一个ASP.NET Core在启动过程中的核心工作就是注册中间件,本节主要介绍应用启动过程中以中间件注册为核心的初始化工作。...作为启动程序集的配置项目的名称为startupAssembly,对应静态类型WebHostDefaults的只读字段StartupAssemblyKey。...,系统就会试着从该程序集中找到一个具有最优匹配度的Startup类型。...我们采用命令行的形式多次启动App应用,并以命令行参数的形式指定启动程序集名称和当前环境名称,控制台上呈现的输出结果如下图所示。...首先在App项目中定义了如下这个实现了IHostingStartup接口的类型Foo,它实现的Configure方法会在控制台上打印出相应的文字以确定该方法是否被调用。
它可标识项目引用、版本选项(如版本号)等事项,并可标识要编译的平台,例如,是 .NET Core 还是 .NET Framework。...或者,如果项目是可移植应用,project.json 可标识项目会在目标计算机(将在其上运行程序集)上安装的框架。...对于传统的.NET项目来说,如果我们需要调用某个API,需要添加所在程序集的引用。...对于.NET Core来说,所有使用到的程序集都被打包成一个NuGet包,所以针对程序集的直接依赖转变成针对某个NuGet包的依赖。...这里使用了一种非常棒的算法来确定要加载的源代码目录: 如果 global.json 中指定的任何源代码位置包含的文件夹具有与包相同的名称(如 Microsoft.Extensions.Logging),
尽管每个标识符都是唯一不同的,但确定它实际引用的内容通常需要对语言规则有深入的了解。 源代码中有表示程序元素的部分,程序也可以引用先前编译的库,这些库打包在程序集文件中。...但是,您可以从现有编译创建一个新的编译,同时指定所做的更改。例如,您可以创建一个与现有编译在所有方面都相同的编译,只是可能包含一个额外的源文件或程序集引用。...符号(Symbols) 符号代表源代码声明的独立元素或作为元数据从程序集导入的元素。每个命名空间、类型、方法、属性、字段、事件、参数或局部变量都由一个符号表示。...例如,源代码中声明的方法和从元数据导入的方法都由具有相同属性的 IMethodSymbol 表示。...要使工作区反映您的更改,必须显式将更改后的解决方案应用回工作区。 项目是整体不可变解决方案模型的一部分。它代表所有源代码文档、解析和编译选项以及程序集和项目之间的引用。
领取专属 10元无门槛券
手把手带您无忧上云