Подтвердить строгое имя работающей сборки - PullRequest
4 голосов
/ 25 февраля 2010

Можно ли проверить строгое имя приложения .NET, которое в настоящее время уже выполняется отдельно от вашего собственного процесса запущенных приложений?


РЕДАКТИРОВАТЬ: Для пояснения, решение, которое нетребовать жесткого закодированного пути к исполняемой сборке было бы наиболее идеальным решением.


РЕДАКТИРОВАТЬ # 2: Есть ли способ сделать это без с использованием отражения?

Ответы [ 5 ]

5 голосов
/ 13 марта 2010

без отражения:

Если вы знаете процесс, вы знаете имя файла. Если вы знаете имя файла, вы можете обработать заголовки PE, чтобы найти подпись строгого имени .

2 голосов
/ 08 марта 2010

Это дает вам то, что вы ищете?

    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 голосов
/ 08 марта 2010

Это должно работать:

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; }
}
0 голосов
/ 15 марта 2010

Хм. Думаю, решением вашей проблемы является класс AssemblyName.
Во-первых

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

затем с каждым процессом возьмите Process.Modules, чтобы загрузить dll или exes, загруженные этим процессом После того, как вы получите имя, которое вы хотите. (модуль имеет свойство name). Тогда используйте

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

Это должно работать. надеюсь, это поможет

0 голосов
/ 25 февраля 2010

Если под "строгим именем" вы подразумеваете имя exe:

using System.Diagnostics;

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...