这是对this answer的跟进(以及它的评论)。从程序集和进程获取可执行文件名有什么区别?
System.Reflection.Assembly.GetCallingAssembly.GetEntryAssembly().CodeBase
vs
Process.GetCurrentProcess().ProcessName
我假设这些一直都是一样的吗?没有?有利有弊吗?
答案 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?
这只是一个例子 - 我确信可能还有其他人。
'希望有所帮助!