首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell 7中奇怪的DLL加载行为

Powershell 7中奇怪的DLL加载行为
EN

Stack Overflow用户
提问于 2021-05-05 20:35:19
回答 1查看 327关注 0票数 1

我成功地将我的测试简化为一个简单的命令:

代码语言:javascript
复制
PS C:\Users\CpUser> [System.Reflection.Assembly]::LoadFrom("C:\Users\CpUser\.nuget\packages\njsonschema\10.4.0\lib\net45\NJsonSchema.dll")
MethodInvocationException: Exception calling "LoadFrom" with "1" argument(s): "Could not load file or assembly 'NJsonSchema, Version=10.4.0.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102'."

我在Windows 10上使用64位Powershell v7.1.3 .作为管理员运行.它无法加载我给它的DLL,这对我来说很奇怪。它也没有给我任何细节,为什么它不能加载它。当我尝试一个较低版本的NJsonSchema.dll时,它可以工作,但是它从一个意想不到的位置加载它:

代码语言:javascript
复制
PS C:\Users\CpUser> [System.Reflection.Assembly]::LoadFrom("C:\Users\CpUser\.nuget\packages\njsonschema\9.10.52\lib\net45\NJsonSchema.dll")

GAC    Version        Location
---    -------        --------
False  v4.0.30319     C:\Program Files\PowerShell\7\NJsonSchema.dll

它是从C:\Program Files\Powershell\7装载的,这在我看来是不对的。我向属性->发送了那个DLL的详细信息,它说它是10.2.2版本。这里似乎正在发生的事情是:

  1. Powershell采用了我在LoadFrom()调用中提供的程序集的版本。
  2. 它在C:\Program Files\PowerShell\7中搜索相同的DLL,其版本等于或大于上一步中获得的版本。
  3. 如果找不到,就失败。

我期望它使用我给它的绝对路径加载DLL。

作为一种解决办法,我找到了另一个似乎有效的解决方案:

代码语言:javascript
复制
$AssemblyPath = "C:\Users\CpUser\.nuget\packages\njsonschema\10.4.0\lib\net45\NJsonSchema.dll"
$bytes = [System.IO.File]::ReadAllBytes($AssemblyPath)
[System.Reflection.Assembly]::Load($bytes)

当我在脚本中运行上面的代码时,我获得了一个成功的结果:

代码语言:javascript
复制
PS C:\Users\CpUser> .\testLoadDll.ps1

GAC    Version        Location
---    -------        --------
False  v4.0.30319

所以我觉得这排除了DLL本身的任何问题。我在这里完全迷路了。有人能解释我看到的行为以及如何得到我期望的行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 22:34:21

根据文档,对于Assembly.LoadFrom法

LoadFrom方法有以下缺点。考虑使用加载代替。 ..。 如果使用LoadFrom加载程序集,并且探测路径包含具有相同标识但位置不同的程序集,则可能会发生InvalidCastException、MissingMethodException或其他意外行为。

更新

解决PowerShell模块组件依赖关系冲突称,

PowerShell和.NET PowerShell运行在.NET平台上。NET最终负责解决和加载程序集依赖关系,因此我们必须了解.NET如何在这里操作以理解依赖冲突。 我们还必须面对这样一个事实:不同版本的PowerShell运行在不同的.NET实现上。一般来说,PowerShell 5.1及更低版本运行在.NET框架上,而PowerShell 6和更高版本运行在.NET核心上。这两个.NET实现以不同的方式加载和处理程序集。这意味着解决依赖冲突取决于底层的.NET平台。

因此,如果使用Powershell版本6和更高版本,请确保正在netstandard2.0文件夹中加载DLL。

尝试以下几点:

打开PowerShell版本7.1.3:

  • 在“键入此处搜索”框中,输入pwsh
  • 右击PowerShell 7 (x64)
  • 选择Run as administrator

Get PowerShell版本

代码语言:javascript
复制
Get-Host | Select-Object Version

获得加载程序集

代码语言:javascript
复制
[System.AppDomain]::CurrentDomain.GetAssemblies()

Load NJsonSchema.dll

注意事项:由于我们使用的是PowerShell 7.x.x,所以使用netstandard2.0文件夹中的NJsonSchema.dll文件。

代码语言:javascript
复制
$Assembly = [System.Reflection.Assembly]::Loadfile('C:\Users\CpUser\.nuget\packages\njsonschema\10.4.0\lib\netstandard2.0\NJsonSchema.dll')

获得加载程序集(再次):

代码语言:javascript
复制
[System.AppDomain]::CurrentDomain.GetAssemblies()

检查NJsonSchema.dll的版本

代码语言:javascript
复制
$Assembly.GetName()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67408425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档