Reflection.AssemblyName()。版本的意外结果

时间:2016-06-30 20:20:49

标签: .net powershell powershell-v2.0 .net-assembly

最近,我不得不检查某些DLL的汇编版本,让我们调用它AAA.BBB.dll,我决定使用一个简单的Powershell命令来获取它,即:

[Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll').Version

我意识到这个命令没有显示我想要的版本。大多数情况下,它会显示一个与当前目录中的dll版本不匹配的固定版本。甚至为GetAssemblyName方法提供了一些无效输入(例如' AAA.BB.dll123')也显示了相同的版本(而不是抛出异常)。我尝试使用绝对路径,但没有帮助。我还检查过AAA.BB.dll不在GAC中。

我可以通过在F#interactive中调用类比代码或在.NET反射器中打开AAA.BB.dll来获得正确的程序集版本。

我已查看AssemblyName.GetAssemblyName的文档,但我无法找到该行为的任何解释。我想知道:

  • 为什么该命令会不断显示DLL的一个版本?

  • 如何解释Powershell和F#interactive中的类比代码之间的差异?是装配解析机制还是.NET Framework配置或.NET Framework版本?

  • 为什么使用无效参数调用GetAssemblyName(即' AAA.BB.dll123')不会抛出异常?

我将输出粘贴在M:目录中执行的几个命令中,这些命令不包含dll。

PS M:\> [Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll').Version

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      600    8


PS M:\> [Reflection.AssemblyName]::GetAssemblyName('aAAA.BB.dll').Version
Exception calling "GetAssemblyName" with "1" argument(s): "Could not load file or assembly 'M:\aAAA.BB.dll' or one o
f its dependencies. The system cannot find the file specified."
At line:1 char:43
+ [Reflection.AssemblyName]::GetAssemblyName <<<< ('aAAA.BB.dll').Version
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

PS M:\> [Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll123').Version

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      600    8


PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB.dll123").Version

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      600    8


PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB123").Version
Exception calling "GetAssemblyName" with "1" argument(s): "Could not load file or assembly 'M:\AAA.BB123' or one of
its dependencies. The system cannot find the file specified."
At line:1 char:43
+ [Reflection.AssemblyName]::GetAssemblyName <<<< ("AAA.BB123").Version
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB.123").Version

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      600    8

我应该注意,程序集版本为1.0.600.8的AAA.BB.dll位于该计算机上的其他目录中。

1 个答案:

答案 0 :(得分:0)

我无法访问相关机器,但我认为错误配置DEVPATH可能是罪魁祸首。某些工具(如反编译器)会修改DEVPATH以使用户能够调试反编译的程序集。

如果this blog entry为真,则如果设置了DEVPATH,则禁用所有常规程序集查找功能,并且DEVPATH中的程序集优先于所有其他程序集。在这种情况下,Powershell显示AAA.BB.dll的固定版本的事实应该不足为奇。如果F#在另一个版本的.NET运行时下运行,则它可能不受该更改的影响。