从程序集与进程中获取当前可执行文件的名称
本文关键字:可执行文件 获取 程序集 进程 | 更新日期: 2023-09-27 18:17:03
这是对这个答案(以及它的评论)的跟进。从程序集与过程中获得可执行名称的区别是什么?
System.Reflection.Assembly.GetCallingAssembly.GetEntryAssembly().CodeBase
和
Process.GetCurrentProcess().ProcessName
我假设这些将是相同的所有时间?没有?有利有弊吗?
它们不一定相同。将这两个程序作为控制台应用程序编译到同一目录下:
// 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
ProcessName是操作系统主机进程的名称。
Assembly CodeBase指向给定进程中的程序集。同一个程序集可以由不同的进程承载。
不,它们不需要返回相同的值。
碰巧,我最近遇到了这个"gotcha":它们可以返回不同的值,这取决于你是直接运行。exe,还是从MSVS调试器内部:
如何获得c#控制台应用程序的。exe名称?
这只是一个例子,我相信还会有其他的例子。
希望这对你有帮助!