【发布时间】:2016-11-03 02:33:12
【问题描述】:
最近,我不得不检查某些DLL的汇编版本,称之为AAA.BBB.dll,我决定使用一个简单的Powershell命令来获取它,即:
[Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll').Version
我意识到这个命令没有显示我想要的版本。大多数情况下,它会显示一个与当前目录中的 dll 版本不匹配的固定版本。即使为 GetAssemblyName 方法提供一些无效输入(例如“AAA.BB.dll123”)也显示相同的版本(而不是引发异常)。我尝试使用绝对路径,但没有帮助。我还检查了 AAA.BB.dll 不在 GAC 中。
我可以通过在 F# 交互中调用类比代码或在 .NET 反射器中打开该 AAA.BB.dll 来获得正确的程序集版本。
我检查了AssemblyName.GetAssemblyName 的文档,但找不到任何关于该行为的解释。我想知道:
为什么该命令总是显示一个 DLL 的一个版本?
如何解释 Powershell 和 F# 交互中的类比代码之间的差异?它与程序集解析机制或.NET Framework 配置或.NET Framework 版本有关吗?
为什么使用无效参数(即“AAA.BB.dll123”)调用 GetAssemblyName 不会引发异常?
我正在粘贴在不包含 dll 的 M: 目录中执行的几个命令的输出。
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 位于该计算机上的某个其他目录中。
【问题讨论】:
-
AAA.BB.dll不是旧的 COM 程序集,对吧? -
不,它是一个托管 DLL
标签: .net powershell powershell-2.0 .net-assembly