2016-06-30 7 views
0

最近、私はAAA.BBB.dllそれを呼び出すと、私はつまり、それを得るために、簡単なPowerShellコマンドを使用することを決めましょう、特定のDLLのアセンブリのバージョンを確認する必要がありました:。Reflection.AssemblyNameの予期しない結果()バージョン

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

私はこのコマンドが私が望むバージョンを表示していないことに気付きました。ほとんどの場合、現在のディレクトリ内のdllのバージョンと一致しない1つの固定バージョンが表示されます。 GetAssemblyNameメソッド(例えば、 'AAA.BB.dll123')にいくつかの無効な入力を提供しても、(例外を投げるのではなく)同じバージョンが示されました。私は絶対パスを使用しようとしたが、それは役に立たなかった。また、AAA.BB.dllがGACにないことを確認しました。

F#対話型で類似のコードを呼び出すか、.NETリフレクタでそのAAA.BB.dllを開くことで、正しいアセンブリバージョンを取得できます。

AssemblyName.GetAssemblyNameのドキュメントを確認しましたが、その動作の説明が見つかりませんでした。私は疑問に思っています:

  • なぜこのコマンドは常に1つのバージョンの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は、そのコンピュータの別のディレクトリにあります。

+0

'AAA.BB.dll'は古いCOMアセンブリの権利ではありませんか? – mxmissile

+0

いいえ、管理対象のDLLです –

答えて

0

私はもう問題のマシンにアクセスできませんが、間違って設定されたDEVPATHが原因であった可能性があります。デコンパイラなどの一部のツールは、DEVPATHを変更して、ユーザーがデコンパイルされたアセンブリをデバッグできるようにします。

this blog entryがtrueの場合、DEVPATHが設定されていると、すべての通常のアセンブリ検索機能が無効になり、DEVPATHのアセンブリが他のすべてのアセンブリよりも優先されます。そのような場合、Powershellが固定バージョンのAAA.BB.dllを表示したという事実は驚くべきことではありません。 F#が別のバージョンの.NETランタイムで実行されている場合、その変更によって影響を受けることはありません。

+1

内部メソッドを使用すると、パスをスキップします: '([Reflection.AssemblyName] .GetMethod( 'nGetFileInformation'、@( 'nonpublic'、 'static')))。 Invoke($ null、 'x:\ full \ path \ to \ assembly.dll')。 – beatcracker

+0

@beatcracker興味深い質問。悲しいことに、私はもうそのマシンにアクセスできないので、テストしません。 –