2010-02-25 3 views
3

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


EDIT: Для разъяснения, решение, которое не требует жесткого закодированный пути к исполняющему сборки будет самым идеальным решением.


EDIT # 2: Есть ли способ сделать это без с помощью отражения?

+0

Я думаю, что вы можете. Поскольку вы не хотите что-то менять в текущем файле. Взгляд не мешает процессу работающего приложения. – TheChange

+0

Что вы хотите сделать точно. Проверьте, имеет ли конкретный процесс сильное имя? Получить полное имя EntryAssembly определенного процесса? Вы не хотите жестко кодировать путь сборки, но имеете ли вы имя процесса или идентификатор процесса процесса, который хотите проверить? –

ответ

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); 
    } 
+0

Знаете ли вы способ сделать это без отражения? –

+1

Я не знаю другого способа сделать это. – 37Stars

+0

+1 и принято, поскольку я использовал это как решение на данный момент. Благодарю. –

-1

Если под «сильным именем» вы имеете в виду имя ехе:

using System.Diagnostics; 

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

} 
+0

Нет, я имею в виду сильное имя. –

+0

сильное имя как в названии приложения? –

+2

Сильное именование, как на http://msdn.microsoft.com/en-us/library/wd40t7ad(VS.71).aspx –

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

Знаете ли вы, как сделать это без отражения? –

+0

Вы имеете в виду без ReflectionOnlyLoadFrom? Почему бы вам не использовать это? Это позволяет вам проверять сборку, не загружая ее в свой процесс. –

+0

Он, к сожалению, блокирует файл процесса. –

4

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

Если вы знаете, процесс, вы знаете имя файла. Если вы знаете имя файла, вы можете process the PE headers to find the strong name signature.

+0

Для получения имени файла из дескриптора процесса: http://stackoverflow.com/questions/1219951/win32api-how-to-get-file-name-of-process-from-process-handle –

+0

+1 - Я didn Не принимайте это, так как я смогу использовать его на более поздней стадии (если вообще), но спасибо за понимание. –

+0

@Kyle Rozendo: добро пожаловать. –

0

Хм, я думаю, решение вашей проблемы - это класс AssemblyName.
Первого

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

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

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

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