質問
アセンブリファイルへのパスのみを与えられて、アセンブリのフルネームを表示したいとします。
コマンドラインプログラムまたはPowerShellスクリプトを簡単に書くことができることは知っていますが、ランタイムには使用できるコマンドが含まれていますか? (GacutilがGACにあるアセンブリのためにそれをするのを見てきましたが、登録されていないアセンブリについてですか?)
解決
メイン 問題があります フルネームの一部は、通常、公開キートークンです。これをVisual Studioコマンドプロンプトウィンドウに入力することで、それを取得できます。
sn -T path\to\your.dll
個人的には、DLLをリフレクターにロードするだけで簡単です。これは、下のパネルのフルネームを示しています。
他のヒント
system.reflection.assemblyname.getAssemblynameを探していると思います。
AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll");
Console.WriteLine(name.FullName);
Assembly.loadを使用するソリューションとは異なり、これはアセンブリをAppDomainにロードしません。これにより、アセンブリが持っている参照を解決することなく、アセンブリ内のコード(モジュール静的コンストラクターなど)を実行することなく、アセンブリのアセンブリ名を取得できます。これにより、アプリケーションが実行されているバージョンとは異なる.NETフレームワークのバージョンをターゲットにするアセンブリのアセンブリ名を取得できます。
これを介して取得できます AssemblyName:
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;
これにより、実際にアセンブリをプロセスにロードすることができません。
別の答えについては、PowerShellでこれを行うことができます。
[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName
これには、取得するためだけにビジュアルスタジオをインストールする必要がないという利点があります sn.exe
, また、公開キーのトークンではなく、アセンブリの完全な強い名前を返すこと。
cmdletスクリプトでそれをラップするのは簡単です:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=0)]
$Path
)
Process {
$FullPath = [System.IO.Path]::GetFullPath($Path);
return [System.Reflection.AssemblyName]::GetAssemblyName($FullPath).FullName;
}
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name