【发布时间】:2011-09-08 20:38:05
【问题描述】:
假设我想显示一个程序集的全名,只给定程序集文件的路径。
我知道我可以很容易地编写命令行程序或 powershell 脚本,但是运行时是否包含我可以使用的命令? (我见过 gacutil 对 gac 中的程序集执行此操作,但对未注册的程序集执行此操作?)
【问题讨论】:
标签: c# .net-assembly
假设我想显示一个程序集的全名,只给定程序集文件的路径。
我知道我可以很容易地编写命令行程序或 powershell 脚本,但是运行时是否包含我可以使用的命令? (我见过 gacutil 对 gac 中的程序集执行此操作,但对未注册的程序集执行此操作?)
【问题讨论】:
标签: c# .net-assembly
我认为您正在寻找 System.Reflection.AssemblyName.GetAssemblyName:
AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll");
Console.WriteLine(name.FullName);
与使用 Assembly.Load 的解决方案不同,这不会将程序集加载到您的 AppDomain 中。这将允许您获取程序集的 AssemblyName,而无需解析程序集具有的任何引用,也无需在程序集中执行任何代码(例如模块静态构造函数)。它甚至可以让您获得针对与您的应用程序运行的版本不同的 .NET Framework 版本的程序集的 AssemblyName。
【讨论】:
Assembly.ReflectionOnlyLoad(...)结合非常有用
全名的主要有问题部分通常是公钥标记。您可以通过在 Visual Studio 命令提示符窗口中输入它来获取它:
sn -T path\to\your.dll
不过,就我个人而言,我发现将 dll 加载到反射器中更容易。这会在底部面板中显示全名。
【讨论】:
你可以通过AssemblyName获得这个:
var name = AssemblyName.GetAssemblyName(path);
var fullname = name.FullName;
这避免了将程序集实际加载到您的进程中。
【讨论】:
对于另一个答案,您可以使用 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;
}
【讨论】:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
【讨论】: