2010-02-25 5 views
3

Est-il possible de vérifier le nom fort d'une application .NET qui est déjà en cours d'exécution séparément de votre propre processus d'applications en cours d'exécution?Validation du nom fort de l'assemblage actif


EDIT: Pour plus de précisions, une solution qui ne nécessite pas un chemin codé en dur à l'ensemble exécution serait la solution la plus idéale.


EDIT # 2: Est-il possible de le faire sans utilisant la réflexion?

+0

Je pense que vous pouvez. Comme vous ne voulez pas changer quelque chose dans le fichier en cours d'exécution. Regarder ne perturbe pas le processus d'une application en cours d'exécution. – TheChange

+0

Que voulez-vous faire exactement? Vérifiez si un processus spécifique a un nom fort? Obtenir le FullName de l'EntryAssembly d'un processus spécifique? Vous ne voulez pas coder en dur le chemin d'assemblage, mais avez-vous le nom du processus ou l'identificateur de processus du processus que vous voulez vérifier? –

Répondre

2

Est-ce que cela vous donne ce que vous cherchez?

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

Connaissez-vous un moyen de le faire sans réflexion? –

+1

Je ne connais pas d'autre moyen de le faire. – 37Stars

+0

+1 et accepté car j'ai utilisé cela comme une solution pour le moment. Merci. –

-1

Si par « nom fort » vous signifie le nom exe:

using System.Diagnostics; 

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

} 
+0

Non, je veux dire le nom fort. –

+0

nom fort comme dans le titre de l'application? –

+2

Nommage fort comme dans http://msdn.microsoft.com/en-us/library/wd40t7ad(VS.71).aspx –

2

Cela devrait fonctionner:

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

Connaissez-vous un moyen de le faire sans réflexion? –

+0

Vous voulez dire sans ReflectionOnlyLoadFrom? Pourquoi ne veux-tu pas l'utiliser? Cela vous permet d'inspecter un assemblage sans vraiment le charger dans votre processus. –

+0

Il bloque malheureusement encore le fichier du processus. –

4

Sans réflexion:

Si vous connaissez le processus, vous connaissez le nom. Si vous connaissez le nom de fichier, vous pouvez process the PE headers to find the strong name signature.

+0

Pour obtenir le nom de fichier à partir de la poignée de processus: http://stackoverflow.com/questions/1219951/win32api-how-to-get-file-name-of-process-from-process-handle –

+0

+1 - I didn N'acceptez pas cela car je ne pourrai l'utiliser que plus tard (le cas échéant), mais je vous remercie pour la perspicacité. –

+0

@Kyle Rozendo: de rien. –

0

Hmm Je pense que la solution à votre problème est la classe AssemblyName.
Première

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

puis avec chaque processus se Process.Modules pour obtenir dll ou exes chargés par ce processus. Après avoir obtenu le nom souhaité. (le module a la propriété name). Ensuite, utilisez

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

Cela devrait fonctionner. espérons que cela aide

Questions connexes