【问题标题】:Validate Strong Name of Running Assembly验证运行程序集的强名称
【发布时间】:2010-02-25 08:33:11
【问题描述】:

是否可以独立于您自己正在运行的应用程序进程检查当前已在运行的 .NET 应用程序的强名称?


编辑:为澄清起见,不需要硬编码路径到执行程序集的解决方案将是最理想的解决方案。


编辑#2:有没有办法做到这一点不使用使用反射?

【问题讨论】:

  • 我想你可以。因为您不想更改正在运行的文件中的某些内容。查看不会干扰正在运行的应用程序的进程。
  • 你到底想做什么。检查特定进程是否具有强名称?获取特定进程的 EntryAssembly 的 FullName?您不想对程序集路径进行硬编码,但您是否有要检查的进程的进程名称或进程 ID?

标签: .net validation strongname


【解决方案1】:

没有反射:

如果你知道这个过程,你就知道文件名。知道文件名的可以process the PE headers to find the strong name signature

【讨论】:

【解决方案2】:

这能满足您的需求吗?

    Process[] processlist = Process.GetProcesses();

    foreach(Process theprocess in processlist)
    {
        string strongName = "N/A";
        try
        {
            strongName = Assembly.ReflectionOnlyLoadFrom(theprocess.MainModule.FileName).FullName;
        }
        catch
        {
            // System process?
        }
        Console.WriteLine("Process: {0} ID: {1} Strong Name: {2}", theprocess.ProcessName, theprocess.Id, strongName);
    }

【讨论】:

  • 你知道没有反射的方法吗?
  • 我知道没有其他方法可以做到这一点。
  • +1 并被接受,因为我暂时将其用作解决方案。谢谢。
【解决方案3】:

应该可以的:

public static bool IsStrongNamed(string assemblyPath)
{
    try
    {
        Assembly a = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
        byte[] publicKey = a.GetName().GetPublicKey();

        return publicKey.Length > 0;
    }
    catch { return false; }
}

public static bool GetStrongName(string assemblyPath)
{
    try
    {
        Assembly a = Assembly.ReflectionOnlyLoadFrom(assemblyPath);

        return a.FullName;
    }
    catch { return string.Empty; }
}

【讨论】:

  • 你知道没有反射的方法吗?
  • 你的意思是没有ReflectionOnlyLoadFrom?你为什么不想使用它?它允许您检查程序集,而无需真正将其加载到您的进程中。
  • 不幸的是,它仍然锁定了进程的文件。
  • 然后你可以使用带有PE头的andras解决方案,但在这种情况下,将dll复制到本地文件夹然后使用ReflectionOnlyLoad可能更容易。
【解决方案4】:

嗯,我认为您的问题的解决方案是 AssemblyName 类。
首先

Process.GetProcesses().Where(p => p.ProcessName = nameUWant); //maybe single or default?

然后在每个进程中使用 Process.Modules 来获取该进程加载的 dll 或 exe。 在你获得你想要的名字之后。 (模块具有名称属性)。 然后使用

AssemblyName.GetAssemblyName().GetPublicKeyToken() != null

这应该可行。 希望对你有帮助

【讨论】:

    【解决方案5】:

    如果“强名称”是指 exe 名称:

    using System.Diagnostics;
    
    if (Process.GetProcessesByName("whatever.exe").Length > 0)
    {
         //do something
    
    }
    

    【讨论】:

    • 应用程序标题中的强名称?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2015-01-28
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多