验证正在运行的程序集的强名称

时间:2010-02-25 08:33:11

标签: .net validation strongname

是否可以检查当前已经与您自己运行的应用程序进程分开运行的.NET应用程序的强名称?


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


编辑#2:有没有办法没有使用反射?

5 个答案:

答案 0 :(得分:5)

没有反思:

如果您知道该过程,则知道文件名。如果您知道文件名,可以process the PE headers to find the strong name signature

答案 1 :(得分: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);
    }

答案 2 :(得分:2)

这应该有效:

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; }
}

答案 3 :(得分:0)

嗯,我认为你的问题的解决方案是AssemblyName类 第一

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

然后在每个进程中使用Process.Modules来获取此进程加载的dll或exes。 获得所需名称后。 (模块具有name属性)。 然后使用

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

这应该有效。 希望它有所帮助

答案 4 :(得分:-1)

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

using System.Diagnostics;

if (Process.GetProcessesByName("whatever.exe").Length > 0)
{
     //do something

}