我如何find当前的可执行文件名?

可能重复:
我如何获得C#中的当前可执行文件的名称?

可执行文件加载外部库。
有没有一种方法让图书馆知道调用的可执行文件?

(我会发誓我看到了这个地方的答案,但我似乎无法再find它了)

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 

如果你想要可执行文件:

 System.Reflection.Assembly.GetEntryAssembly().Location 

如果你想要消耗你的库的程序集(如果你的代码是直接从你的可执行文件中的一个类中调用的话,那么可能和上面的程序集是一样的):

 System.Reflection.Assembly.GetCallingAssembly().Location 

如果您只想要文件而不是path,请使用:

 Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) 

除了上面的答案。

我写了下面的test.exe作为控制台应用程序

 static void Main(string[] args) { Console.WriteLine( System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Console.WriteLine( System.Reflection.Assembly.GetEntryAssembly().Location); Console.WriteLine( System.Reflection.Assembly.GetExecutingAssembly().Location); Console.WriteLine( System.Reflection.Assembly.GetCallingAssembly().Location); } 

然后我编译该项目,并将其输出重命名为test2.exe文件。 输出线是正确的和相同的。

但是,如果我在Visual Studio中启动它,结果是:

d:\ test2.vhost.exe

d:\ test2.exe

d:\ test2.exe

C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ mscorlib.dll中

Visual Studio的ReSharper插件强调了这一点

 System.Diagnostics.Process.GetCurrentProcess().MainModule 

尽可能System.NullReferenceException。 如果你看看MainModule的文档,你会发现这个属性也可以抛出NotSupportedException,PlatformNotSupportedException和InvalidOperationExceptionexception。

GetEntryAssembly方法也不是100%“安全”。 MSDN:

从非托pipe应用程序加载托pipe程序集时,GetEntryAssembly方法可以返回null。 例如,如果非托pipe应用程序创build用C#编写的COM组件的实例,则从C#组件调用GetEntryAssembly方法将返回null,因为进程的入口点是非托pipe代码而不是托pipe程序集。

对于我的解决scheme,我更喜欢Assembly.GetEntryAssembly().Location

更多的兴趣是如果需要解决虚拟化的问题。 例如,我们有一个项目,我们使用Xenocode Postbuild将.net代码链接到一个可执行文件中。 这个可执行文件必须重命名。 所以上面的所有方法都不起作用,因为它们只获取原始程序集或内部进程的信息。

我find的唯一解决scheme是

 var location = System.Reflection.Assembly.GetEntryAssembly().Location; var directory = System.IO.Path.GetDirectoryName(location); var file = System.IO.Path.Combine(directory, System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"); 

Environment.GetCommandLineArgs()[0]

我认为这应该是你想要的:

 System.Reflection.Assembly.GetEntryAssembly().Location 

这将返回当进程启动时第一次加载的程序集,这似乎是你想要的。

GetCallingAssembly在一般情况下不一定会返回你想要的程序集,因为它会返回包含调用堆栈中更高的方法的程序集(也就是说它可能在同一个DLL中)。

Assembly.GetEntryAssembly()

这一个不包括在内:

 System.Windows.Forms.Application.ExecutablePath; 

〜乔