独自の実行中のアプリケーション プロセスとは別に、現在既に実行されている .NET アプリケーションの厳密な名前を確認することは可能ですか?
編集:明確にするために、実行中のアセンブリへのハードコードされたパスを必要としないソリューションが最も理想的なソリューションです。
編集 #2:リフレクションを使用せずにこれを行う方法はありますか?
独自の実行中のアプリケーション プロセスとは別に、現在既に実行されている .NET アプリケーションの厳密な名前を確認することは可能ですか?
編集:明確にするために、実行中のアセンブリへのハードコードされたパスを必要としないソリューションが最も理想的なソリューションです。
編集 #2:リフレクションを使用せずにこれを行う方法はありますか?
反射なし:
プロセスがわかれば、ファイル名もわかります。ファイル名がわかっている場合は、PE ヘッダーを処理して厳密な名前の署名を見つけることができます。
これはあなたが探しているものをあなたに与えますか?
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);
}
それはうまくいくはずです:
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; }
}
うーん、あなたの問題の解決策は AssemblyName クラスだと思います。
初め
Process.GetProcesses().Where(p => p.ProcessName = nameUWant); //maybe single or default?
次に、各プロセスで Process.Modules を取得して、このプロセスによってロードされた dll または exe を取得します。あなたが望む名前を取得した後。(モジュールには name プロパティがあります)。次に使用します
AssemblyName.GetAssemblyName().GetPublicKeyToken() != null
これはうまくいくはずです。それが役に立てば幸い
「厳密な名前」とは、exe 名を意味する場合:
using System.Diagnostics;
if (Process.GetProcessesByName("whatever.exe").Length > 0)
{
//do something
}