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

Bor*_*ens 100 .net c#

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

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

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

Tho*_*que 128

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
Run Code Online (Sandbox Code Playgroud)

  • 这个往往会添加".vhost".在文件名中,如果使用System.Reflection.Assembly.GetEntryAssembly(),则不存在问题.位置(请参阅备用答案). (7认同)
  • @Contango,这是在VS中使用"Visual Studio Hosting Process"引起的. (4认同)
  • @Kiquenet,是的,在单元测试中,当前的可执行文件是测试运行器; 你想说什么? (3认同)
  • 这给出了可执行文件的完整路径,如果您只需要可执行文件名,请使用 System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName。 (3认同)

Mat*_*ley 81

如果你想要可执行文件:

System.Reflection.Assembly.GetEntryAssembly().Location
Run Code Online (Sandbox Code Playgroud)

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

System.Reflection.Assembly.GetCallingAssembly().Location
Run Code Online (Sandbox Code Playgroud)

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

Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)
Run Code Online (Sandbox Code Playgroud)

  • 如果从非托管代码调用,GetEntryAssembly可能返回null. (6认同)

Ale*_*aum 42

除了上面的答案.

我写了以下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);
}
Run Code Online (Sandbox Code Playgroud)

然后我编译了项目并将其输出重命名为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
Run Code Online (Sandbox Code Playgroud)

尽可能的System.NullReferenceException.如果查看MainModule的文档,您会发现此属性还会抛出NotSupportedException,PlatformNotSupportedException和InvalidOperationException.

GetEntryAssembly方法也不是100%"安全".MSDN:

从非托管应用程序加载托管程序集时,GetEntryAssembly方法可以返回null.例如,如果非托管应用程序创建用C#编写的COM组件的实例,则从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");
Run Code Online (Sandbox Code Playgroud)


mna*_*mov 11

Environment.GetCommandLineArgs()[0]


Nol*_*rin 7

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

System.Reflection.Assembly.GetEntryAssembly().Location
Run Code Online (Sandbox Code Playgroud)

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

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