【发布时间】:2021-07-28 04:42:55
【问题描述】:
我已经设法将我的测试归结为一个简单的命令:
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。 似乎在这里发生的事情是:
- Powershell 采用我在
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 本身的任何问题。我完全迷失在这里。有人可以解释我看到的行为以及如何获得我期望的行为吗?
【问题讨论】:
-
它没有告诉我为什么它无法加载它的任何细节尝试打开assembly binding failure logs
标签: c# .net powershell