从程序集与进程获取当前可执行文件的名称?

时间:2011-12-06 20:56:00

标签: c# .net

这是对this answer的跟进(以及它的评论)。从程序集和进程获取可执行文件名有什么区别?

System.Reflection.Assembly.GetCallingAssembly.GetEntryAssembly().CodeBase 

vs

Process.GetCurrentProcess().ProcessName

我假设这些一直都是一样的吗?没有?有利有弊吗?

3 个答案:

答案 0 :(得分:5)

它们不一定相同。将这两个程序编译为同一目录中的控制台应用程序:

// In Test.cs, compile to Test.exe
using System;
using System.Reflection;

public static class Program
{
    static void Main(string[] args)
    {
        AppDomain.CreateDomain("NewDomain").ExecuteAssembly("Test2.exe");
    }
}

// In Test2.cs, compile to Test2.exe
using System;
using System.Diagnostics;
using System.Reflection;

class Test2
{
    static void Main()
    {
        Console.WriteLine("Process: {0}",
                          Process.GetCurrentProcess().ProcessName);
        Console.WriteLine("Entry assembly: {0}", 
                          Assembly.GetEntryAssembly().CodeBase);
    }
}

输出:

Process: Test
Entry assembly: file:///c:/Users/Jon/Test/Test2.EXE

答案 1 :(得分:4)

ProcessName是操作系统主机进程的名称。

汇编CodeBase指向给定进程内的程序集。同一个程序集可以由不同的进程托管。

答案 2 :(得分:3)

不,他们不需要返回相同的值。

碰巧,我最近碰到了这个“陷阱”:他们可以返回不同的值,具体取决于你是直接运行.exe还是从MSVS调试器内部运行:

How do I get the .exe name of a C# console application?

这只是一个例子 - 我确信可能还有其他人。

'希望有所帮助!