假设我想显示程序集的全名,只给出程序集文件的路径。
我知道我可以轻松编写命令行程序或powershell脚本,但运行时是否包含我可以使用的命令? (我已经看到gacutil为gac中的程序集做了这个,但是关于未注册的程序集呢?)
答案 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