- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Windows 10 x64、PowerShell 5.1 版中工作。
我有多个版本的 .NET Framework 4.0 程序集 (.dll)(由我自己)用 C# 编写。程序集未签名。它们的版本通过 [assembly: AssemblyVersion("X.X.X.X")]
在 AssemblyInfo.cs
中设置。 [assembly: AssemblyFileVersion("X.X.X.X")]
标记在我的 AssemblyInfo.cs
中不存在!这些程序集在常规 .NET Framework 应用程序中使用,它们不是专门的 PowerShell 模块,也没有 list 文件。
我在一些 PowerShell 脚本中使用这个程序集来创建对象并从中调用方法。
我有这个程序集的两个版本,比如说 1.1.1.100
和 1.2.1.100
。当我通过 Import-Module "D:\path\to_v1.1\MyAssembly.dll"
在 PowerShell 中导入 1.1.1.100
版本时,它工作得很好。当我调用 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. 我的程序集对我的其他程序集(在同一文件夹中)有一些依赖性。这些依赖项会自动解析并隐式“导入”到当前 session (我可以毫无问题地使用它们的类型)。主要 MyAssembly.dll
的每个版本都依赖于这些辅助程序集的不同版本。当我导入另一个版本的 MyAssembly
时,我也没有收到有关版本冲突的错误。再一次,我只能使用最早导入的二级程序集的类型。我读过有关“依赖 hell ”的文章,这应该是不可能的——那怎么可能呢?
我对 NuGet 包 Microsoft.CodeAnalysis.CSharp.dll
、版本 3.4.0
和 3.11.0
进行了相同的实验.结果是一样的:版本及其依赖导入没有问题,但只有最早导入的版本可用。
当我导入相同程序集的不同版本时,没有出现任何错误,但只有最早导入的版本可用。 我想了解为什么我能够在一个 session 中无错误地加载一个程序集的多个版本,PowerShell 通常如何处理这些情况以及为什么它显示两个具有相同版本的模块,为什么我不这样做'得到依赖 hell 。
我想了解发生了什么,而不仅仅是“让它工作”。
我在这里错过了什么?
谢谢!
最佳答案
在您的场景中,您的模块是独立的 .NET 程序集,它们实现了 PowerShell cmdlet。
在 Windows PowerShell 和 PowerShell (Core) 7+ 中,所有程序集都加载到相同:
PowerShell (Core) 7+ 中的 ALC(程序集加载上下文),它基于 .NET Core/.NET 5+。 p>
默认情况下,不支持加载同一个程序集的多个版本,加载到 session 中的第一个将获胜。
随后尝试加载程序集的不同版本:
在 Windows PowerShell 中被悄悄忽略 - 无论您是否使用 Import-Module
、Add-Type - LiteralPath
或其底层 .NET API 方法,[System.Reflection.Assembly]::LoadFrom()
(一定要将完整文件路径传递给后者,因为 PowerShell 的工作目录通常与 .NET 不同;该方法输出一个表示程序集的对象,表面上是刚刚加载的,但它实际上表示 < em>最初加载的版本)。
在 Powershell (Core) 7+ 中导致语句终止错误
Assembly with same name is already loaded.
注意:您可以加载不同版本的程序集,即通过[System.Reflection.Assembly]::LoadFile()
方法(注意 File
而不是 From
),但是您可以使用其类型的唯一方法是通过反射。
据我所知:
没有cmdlet 实现程序集的解决方案,如您的情况。
cmdlet-implementing 我的意思是模块的 cmdlet 本身作为存储在程序集中的 .NET 类实现,而不是在 PowerShell 代码中实现的 cmdlet , 在 *.psm1
脚本模块文件中。
无论您在 session 中首先导入/加载 cmdlet 实现程序集的哪个版本,在 session 的其余部分都是唯一可用的;程序集一旦加载,就无法卸载。
另一种表达方式:虽然您可以在磁盘上拥有此类模块的并排版本,但您不能同时将它们加载到 session 中,据我所知 - 这只适用于基于脚本的模块(见下一点)。
将多个版本的 helper 程序集加载到同一 session 中有一些非常重要的解决方案;这些在 Resolving PowerShell module assembly dependency conflicts 中有详细说明,其中还提供了广泛的背景信息。
关于c# - PowerShell:为什么我能够在一个 session 中加载同一 .NET 程序集的多个版本以及 "bypass Dependency hell"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68972925/
如果我有一个包含 debian/control 和 Build-Depends 条目的 Depends 文件。 如何安装两组依赖项? 目前我正在使用以下命令创建一个依赖于 Build-Depends
我一直在查看衬底节点模板的Cargo.toml文件,并注意到,对于大多数 crate 而言,其依赖性如下所示: [dependencies.grandpa] package = 'sc-finalit
我在 Netbeans 7.1 IDE 中有一个 Maven 项目。 我想为 Dependencies 添加相同的依赖项和 Test Dependencies . 添加到一个中会将其从另一个中删除。
我正在尝试解决此处描述的问题: http://www.jayway.com/2013/04/12/solving-asm-conflicts-after-upgrading-to-groovy-2-1
我研究过这个问题,但找不到共识。如果“A 依赖于 B”,术语“依赖性”指的是: 一个 B A和B的关系 这个术语在计算机技术的不同子领域中是否有不同的含义? 最佳答案 B 将是依赖项。您可能会以“B
WebLogic 10.3.6Java 1.6 所以我在使用 Eclipse 时遇到了 XML 问题。 7天前我去度假之前,这一切运行良好。事实上,在我离开之前,我恢复到了旧版本,因为我在一些不太重要
在问这个问题之前,我想说 this stackoverflow 中的问题与我的问题非常相似,但概念仍然不清楚,非常困惑。 我想了解依赖倒置原则,但我无法完全理解它? 下面是DIP说的两点 A. Hig
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我正在尝试使用 apache maven 创建一个包。当我运行 mvn clean install 命令时,出现以下错误: dependencies.dependency.version' is mi
在 Real World Ocaml Chapter 9这是关于仿函数的: Dependency injection Makes the implementations of some compone
我已经构建了类似用于创建网站的基本模板/工作流的东西,主要使用 Grunt。 该模板的一部分是 Modernizr 特征检测库,我的一项 Grunt 任务依赖于它。 目前我只是将该依赖项存储在我的 b
我有固定依赖项的 python 项目。由于第三方依赖项中的错误,在我的包中发现了错误。该依赖项已发布修复该错误的补丁。然而,根据 semantic versioning ,是否为固定依赖项的每个补丁版
使用插件io.spring.dependency-management ,我的依赖的一些版本是从其他依赖中扣除的 id("io.spring.dependency-management") versi
我有这两个表“员工表,从属表” 员工表有“ID, employee_id, employee_name” 从属表有“ID, employee_id, dependent_name, relations
我正在使用 Eclipse 中的一个 mavenised java 项目,其中有几个模块无法构建并从 pom 文件中抛出错误: Project build error: 'dependencies.d
我有一个包含多个模块的 maven 项目。在 Eclipse(Juno,带有 m2e)中,它似乎编译得很好。但是当我在其中一个模块上进行 maven 安装时,构建会立即失败。 父 pom: com
我使用 eclipse juno 创建了一个 maven 项目并编辑了 pom 文件。当我通过“mvn clean install”使用命令提示符运行 pom 文件时,出现此错误。 [ERROR] T
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
似乎包括与 provided 的直接依赖关系范围很好理解。似乎还包括带有 runtime 的传递依赖项。范围也很容易实现。 但是我如何才能包含两个间接级别的依赖项? 例子: A --> B --> C
我有以下情况: 我想在我的另一个项目中使用我的一个项目(托管在 bintray.com 上)。 我设置了一个 Maven 存储库,上传了 Artifact 和 pom 文件,然后能够使用上传到 bin
我是一名优秀的程序员,十分优秀!