我在 Windows 10 x64、PowerShell 版本 5.1 中工作。
我有多个版本的 .NET Framework 4.0 程序集 (.dll) 用 C#(我自己)编写。程序集未签名。他们的版本是AssemblyInfo.cs
通过设置的[assembly: AssemblyVersion("X.X.X.X")]
。我的[assembly: AssemblyFileVersion("X.X.X.X")]
标签不存在AssemblyInfo.cs
!这些程序集在常规 .NET Framework 应用程序中使用,它们不是专门的 PowerShell 模块,也没有清单文件。
我在一些 PowerShell 脚本中使用这个程序集来创建对象并从中调用方法。
我有这个程序集的两个版本,比如说1.1.1.100
和1.2.1.100
。1.1.1.100
当我通过 PowerShell导入假设版本时Import-Module "D:\path\to_v1.1\MyAssembly.dll"
,它工作得很好。当我打电话时,Get-Module
我在列表中看到了这个导入的程序集:
ModuleType Version Name
---------- ------- ----
Binary 1.1.1.100 MyAssembly
现在事情开始变得有趣了。我导入了其他版本的程序集Import-Module "D:\another\path\to_v1.2\MyAssembly.dll"
。它再次工作得很好。所以这是我的问题:
Q1。为什么没有显示错误?我希望得到一个错误:我正在尝试加载一个名称相同但版本不同的程序集。我认为您无法在一个上下文中加载同一程序集的两个不同版本。这些情况是如何处理的,使用了哪些加载上下文?也许根本没有加载第二个版本?
Q2。 Get-Module
现在显示两个具有相同名称和版本的模块,如下所示:
ModuleType Version Name
---------- ------- ----
Binary 1.1.1.100 MyAssembly
Binary 1.1.1.100 MyAssembly
我先导入哪个版本并不重要。在第二个Import-Module
,最早导入的版本在Get-Module
列表中重复。我也只能使用最早导入的程序集版本中的类型/方法。
Q3。我的程序集对我的其他程序集(在同一文件夹中)有一些依赖关系。这些依赖项会自动解析并隐式“导入”到当前会话(我可以使用它们中的类型没问题)。主程序的每个版本都MyAssembly.dll
依赖于这些辅助程序集的不同版本。当我导入另一个版本时MyAssembly
,我也没有收到关于版本冲突的错误。再一次,我只能使用最早导入的辅助程序集中的类型。我读过“依赖地狱”,这应该是不可能的——那怎么可能呢?
我对 NuGet 包Microsoft.CodeAnalysis.CSharp.dll
、版本3.4.0
和3.11.0
. 结果是一样的:版本及其依赖导入没问题,但只有最早导入的版本可用。
概括
当我导入相同程序集的不同版本时,我没有收到任何错误,但只有最早的导入版本可用。我想了解为什么我能够在一个会话中加载程序集的多个版本而不会出错,PowerShell 通常如何处理这些情况以及为什么它显示两个具有相同版本的模块,为什么我没有得到依赖地狱。
我想了解发生了什么,而不仅仅是“让它工作”。
我在这里想念什么?
谢谢!