如何找到当前的可执行文件名?

时间:2009-06-11 09:35:22

标签: c# .net

  

可能重复:
  How do I get the name of the current executable in C#?

可执行文件加载外部库 有没有办法让库知道调用可执行文件?

(我会发誓我在其他地方看到了答案,但我似乎无法再找到它了)

7 个答案:

答案 0 :(得分:124)

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

答案 1 :(得分:77)

如果你想要可执行文件:

System.Reflection.Assembly.GetEntryAssembly().Location

如果你想要使用你的库的程序集(可能是与上面相同的程序集,如果直接从你的可执行文件中的类调用你的代码):

System.Reflection.Assembly.GetCallingAssembly().Location

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

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

答案 2 :(得分:41)

除了上面的答案。

我将以下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和InvalidOperationException。

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

  

当托管程序集时,GetEntryAssembly方法可以返回null   已从非托管应用程序加载。例如,如果是   非托管应用程序创建一个写入的COM组件的实例   在C#中,从C#组件调用GetEntryAssembly方法   返回null,因为进程的入口点是非托管的   代码而不是托管程序集。

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

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

我找到的唯一解决方案是

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");

答案 3 :(得分:11)

Environment.GetCommandLineArgs()[0]

答案 4 :(得分:7)

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

System.Reflection.Assembly.GetEntryAssembly().Location

这将返回进程启动时首次加载的程序集,这似乎就是您想要的。

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

答案 5 :(得分:3)

Assembly.GetEntryAssembly()

答案 6 :(得分:2)

这个没有包括在内:

System.Windows.Forms.Application.ExecutablePath;

〜乔