Получение полного названия сборки
-
28-10-2019 - |
Вопрос
Предположим, я хочу отобразить полное имя сборки, с учетом всего пути к файлу сборки.
Я знаю, что мог бы легко написать программу командной строки или сценарий PowerShell, но включает ли время выполнения команду, которую я мог бы использовать? (Я видел, как Гакутил делал это для собраний, которые находятся в 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, это не загрузит сборку в ваше приложение. Это позволит вам получить сборочное именем для сборки без необходимости разрешения каких -либо ссылок, которые есть в Ассамблеи, и без какого -либо кода (например, статические конструкторы модуля) в сборке. Это даже позволит вам получить сборочную имени сборки, которая нацелена на версию .NET Framework, которая отличается от версии, на которой работает ваше приложение.
Вы можете получить это через Ассамблея имени:
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;
Это избегает фактической загрузки сборки в ваш процесс.
Для другого ответа вы можете сделать это с PowerShell:
[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName
Это имеет то преимущество в том, что не нужно установить Visual Studio, чтобы получить sn.exe
, а также то, что он возвращает полное сильное имя для сборки, а не только токен открытого ключа.
Достаточно легко обернуть это в сценарий командлета:
[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