获取程序集的全名

时间:2011-09-08 20:38:06

标签: c# .net-assembly

假设我想显示程序集的全名,只给出程序集文件的路径。

我知道我可以轻松编写命令行程序或powershell脚本,但运行时是否包含我可以使用的命令? (我已经看到gacutil为gac中的程序集做了这个,但是关于未注册的程序集呢?)

5 个答案:

答案 0 :(得分:17)

我认为您正在寻找System.Reflection.AssemblyName.GetAssemblyName:

AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll");
Console.WriteLine(name.FullName);

与使用Assembly.Load的解决方案不同,这不会将程序集加载到AppDomain中。这将允许您获取程序集的AssemblyName,而无需解析程序集具有的任何引用,也无需在程序集中执行任何代码(例如模块静态构造函数)。它甚至可以让你获得一个程序集的AssemblyName,该程序集面向的.NET Framework版本与运行应用程序的版本不同。

答案 1 :(得分:5)

全名的主要有问题的部分通常是公钥令牌。您可以通过在Visual Studio命令提示符窗口中输入它来获取它:

sn -T path\to\your.dll

就个人而言,我发现将dll加载到反射器中会更容易。这会在底部面板中显示全名。

答案 2 :(得分:4)

您可以通过AssemblyName

获取此信息
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;

这可以避免实际将程序集加载到您的流程中。

答案 3 :(得分:2)

对于另一个答案,您可以使用PowerShell执行此操作:

[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName

这样做的好处是不需要安装Visual Studio来获取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;
}

答案 4 :(得分:0)

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name