【问题标题】:getting the full name of an assembly获取程序集的全名
【发布时间】:2011-09-08 20:38:05
【问题描述】:

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

我知道我可以很容易地编写命令行程序或 powershell 脚本,但是运行时是否包含我可以使用的命令? (我见过 gacutil 对 gac 中的程序集执行此操作,但对未注册的程序集执行此操作?)

【问题讨论】:

    标签: c# .net-assembly


    【解决方案1】:

    我认为您正在寻找 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 想要的,但正是我自己想要的!谢谢
    • Assembly.ReflectionOnlyLoad(...)结合非常有用
    【解决方案2】:

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

    sn -T path\to\your.dll
    

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

    【讨论】:

    • 您可以编写一个控制台应用程序,而不是将其加载到反射器中:D
    • @Marc 足够接近——我会在 Powershell 中使用反射器,甚至只是 [System.Reflection.Assembly]::ReflectionLoadFrom().FullName,但我需要一个简单的命令行工具,我可以通过给支持人员 - 刚刚推出了我自己的。
    【解决方案3】:

    你可以通过AssemblyName获得这个:

    var name = AssemblyName.GetAssemblyName(path);
    var fullname = name.FullName;
    

    这避免了将程序集实际加载到您的进程中。

    【讨论】:

    • 对不起,这不是我要找的。我确实知道如何在代码中做到这一点。我所追求的是命令行选项,因为我必须教支持人员如何做到这一点。我希望有一个内置的 cmd 可以让我得到我想要的 - 最终滚动我自己的。但是——我使用的是 Assembly.ReflectionLoadFrom()。无论如何,我将切换到使用 AssemblyName.GetAssemblyName +1 作为 AssemblyName 提示。
    【解决方案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;
    }
    

    【讨论】:

      【解决方案5】:
      System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
      

      【讨论】:

      • 对不起,这不是我要找的。我确实知道如何在代码中做到这一点。我所追求的是命令行选项,因为我必须教支持人员如何做到这一点。我希望有一个内置的 cmd 可以让我得到我想要的——最终滚动我自己的
      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多