我成功地将我的测试简化为一个简单的命令:
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时,它可以工作,但是它从一个意想不到的位置加载它:
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版本。这里似乎正在发生的事情是:
LoadFrom()调用中提供的程序集的版本。C:\Program Files\PowerShell\7中搜索相同的DLL,其版本等于或大于上一步中获得的版本。我期望它使用我给它的绝对路径加载DLL。
作为一种解决办法,我找到了另一个似乎有效的解决方案:
$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)当我在脚本中运行上面的代码时,我获得了一个成功的结果:
PS C:\Users\CpUser> .\testLoadDll.ps1
GAC Version Location
--- ------- --------
False v4.0.30319所以我觉得这排除了DLL本身的任何问题。我在这里完全迷路了。有人能解释我看到的行为以及如何得到我期望的行为吗?
发布于 2021-05-05 22:34:21
根据文档,对于Assembly.LoadFrom法
LoadFrom方法有以下缺点。考虑使用加载代替。 ..。 如果使用LoadFrom加载程序集,并且探测路径包含具有相同标识但位置不同的程序集,则可能会发生InvalidCastException、MissingMethodException或其他意外行为。
更新
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:
pwshPowerShell 7 (x64)Run as administratorGet PowerShell版本
Get-Host | Select-Object Version

获得加载程序集
[System.AppDomain]::CurrentDomain.GetAssemblies()Load NJsonSchema.dll
注意事项:由于我们使用的是PowerShell 7.x.x,所以使用netstandard2.0文件夹中的NJsonSchema.dll文件。
$Assembly = [System.Reflection.Assembly]::Loadfile('C:\Users\CpUser\.nuget\packages\njsonschema\10.4.0\lib\netstandard2.0\NJsonSchema.dll')获得加载程序集(再次):
[System.AppDomain]::CurrentDomain.GetAssemblies()

检查NJsonSchema.dll的版本
$Assembly.GetName()

https://stackoverflow.com/questions/67408425
复制相似问题