获取程序集的完整名称

5
假设我只有程序集文件的路径,想要显示程序集的完整名称。
我知道可以编写命令行程序或PowerShell脚本很容易,但是是否运行时包含可以使用的命令?(我已经看到gacutil可以处理GAC中的程序集,但对于未注册的程序集呢?)
5个回答

17

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

AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll");
Console.WriteLine(name.FullName);
与使用Assembly.Load的解决方案不同,这种方法不会将程序集加载到您的AppDomain中。这将允许您获取程序集的AssemblyName,而无需解析该程序集具有的任何引用,并且无需执行程序集中的任何代码(例如模块静态构造函数)。它甚至可以让您获取针对与您的应用程序正在运行的.NET Framework版本不同的版本的程序集的AssemblyName。

抱歉,这不是我要找的。我知道如何在代码中实现它。我想要的是一个命令行选项,因为我需要教一个支持人员如何做到这一点。我希望有一个内置的 cmd 可以让我得到我想要的东西——最终我自己动手实现了。 - JMarsch
1
可能不是JMarsch想要的,但正是我自己想要的!谢谢。 - Umar Farooq Khawaja
1
Assembly.ReflectionOnlyLoad(...) 结合使用非常有用。 - marsze

5

完整名称中最容易出问题的部分通常是公钥令牌。您可以通过在Visual Studio命令提示窗口中输入以下内容来获取它:

sn -T path\to\your.dll

个人而言,我觉得直接将dll加载到反射器中比较方便。这样可以在底部面板中显示完整的名称。


不必将其加载到反编译器中,你可以编写一个控制台应用程序 :D - Jamiec
@Marc 差不多了 -- 我会使用反射器(reflector)或者甚至只是在Powershell中使用[System.Reflection.Assembly]::ReflectionLoadFrom().FullName,但我需要一个简单的命令行工具,可以传递给支持人员 -- 所以我自己写了一个。 - JMarsch

4

另一种方法是使用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
您可以通过 AssemblyName 获取此信息:
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;

这样可以避免将程序集加载到您的进程中。

抱歉,这不是我要找的。我知道如何在代码中实现它。我想要的是一个命令行选项,因为我需要教一个支持人员如何做到这一点。我希望有一个内置的 cmd 可以让我得到我想要的东西——最终我自己解决了这个问题。然而,我使用的是 Assembly.ReflectionLoadFrom()。无论如何,我会切换到使用 AssemblyName.GetAssemblyName +1 来获取 AssemblyName 提示。 - JMarsch

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

抱歉,这不是我要找的。我知道如何在代码中实现它。我想要的是一个命令行选项,因为我需要教一个支持人员如何做到这一点。我希望有一个内置的 cmd 可以让我得到我想要的东西——最终我自己解决了这个问题。 - JMarsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接