4

独自の実行中のアプリケーション プロセスとは別に、現在既に実行されている .NET アプリケーションの厳密な名前を確認することは可能ですか?


編集:明確にするために、実行中のアセンブリへのハードコードされたパスを必要としないソリューションが最も理想的なソリューションです。


編集 #2:リフレクションを使用せずにこれを行う方法はありますか?

4

5 に答える 5

5

反射なし:

プロセスがわかれば、ファイル名もわかります。ファイル名がわかっている場合は、PE ヘッダーを処理して厳密な名前の署名を見つけることができます。

于 2010-03-12T22:57:28.403 に答える
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);
    }
于 2010-03-08T19:07:58.650 に答える
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; }
}
于 2010-03-08T19:16:54.413 に答える
0

うーん、あなたの問題の解決策は AssemblyName クラスだと思います。
初め

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

次に、各プロセスで Process.Modules を取得して、このプロセスによってロードされた dll または exe を取得します。あなたが望む名前を取得した後。(モジュールには name プロパティがあります)。次に使用します

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

これはうまくいくはずです。それが役に立てば幸い

于 2010-03-15T09:00:01.943 に答える
-1

「厳密な名前」とは、exe 名を意味する場合:

using System.Diagnostics;

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

}
于 2010-02-25T08:40:46.933 に答える