最近,我不得不检查某些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位于该计算机上的其他目录中。
答案 0 :(得分:0)
我无法访问相关机器,但我认为错误配置DEVPATH可能是罪魁祸首。某些工具(如反编译器)会修改DEVPATH以使用户能够调试反编译的程序集。
如果this blog entry为真,则如果设置了DEVPATH,则禁用所有常规程序集查找功能,并且DEVPATH中的程序集优先于所有其他程序集。在这种情况下,Powershell显示AAA.BB.dll的固定版本的事实应该不足为奇。如果F#在另一个版本的.NET运行时下运行,则它可能不受该更改的影响。