【问题标题】:Unexpected result of Reflection.AssemblyName().VersionReflection.AssemblyName().Version 的意外结果
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 只是好奇,如果使用内部方法可行(跳过解析路径):([Reflection.AssemblyName].GetMethod('nGetFileInformation', @('nonpublic','static'))).Invoke($null, 'x:\full\path\to\assembly.dll)
  • @beatcracker 有趣的问题。遗憾的是,我无法再访问那台机器,所以我不会对其进行测试。
猜你喜欢
  • 2011-09-15
  • 2012-04-02
  • 2019-05-14
  • 2017-07-11
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多