假设我只有程序集文件的路径,想要显示程序集的完整名称。
我知道可以编写命令行程序或PowerShell脚本很容易,但是是否运行时包含可以使用的命令?(我已经看到gacutil可以处理GAC中的程序集,但对于未注册的程序集呢?)
我知道可以编写命令行程序或PowerShell脚本很容易,但是是否运行时包含可以使用的命令?(我已经看到gacutil可以处理GAC中的程序集,但对于未注册的程序集呢?)
我认为你正在寻找System.Reflection.AssemblyName.GetAssemblyName:
AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll");
Console.WriteLine(name.FullName);
与使用Assembly.Load的解决方案不同,这种方法不会将程序集加载到您的AppDomain中。这将允许您获取程序集的AssemblyName,而无需解析该程序集具有的任何引用,并且无需执行程序集中的任何代码(例如模块静态构造函数)。它甚至可以让您获取针对与您的应用程序正在运行的.NET Framework版本不同的版本的程序集的AssemblyName。完整名称中最容易出问题的部分通常是公钥令牌。您可以通过在Visual Studio命令提示窗口中输入以下内容来获取它:
sn -T path\to\your.dll
个人而言,我觉得直接将dll加载到反射器中比较方便。这样可以在底部面板中显示完整的名称。
另一种方法是使用PowerShell:
[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName
sn.exe
,而且它返回的是程序集的完整强名称,而不仅仅是公钥标记。[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=0)]
$Path
)
Process {
$FullPath = [System.IO.Path]::GetFullPath($Path);
return [System.Reflection.AssemblyName]::GetAssemblyName($FullPath).FullName;
}
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Assembly.ReflectionOnlyLoad(...)
结合使用非常有用。 - marsze