Answers:
System.AppDomain.CurrentDomain.FriendlyName
System.AppDomain.CurrentDomain.FriendlyName
在Click-Once部署的应用程序下使用时遇到了问题。对于我们来说,这将返回“ DefaultDomain ”,而不是原始的exe名称。
string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
System.AppDomain.CurrentDomain.FriendlyName
-返回带有扩展名的文件名(例如MyApp.exe)。
System.Diagnostics.Process.GetCurrentProcess().ProcessName
-返回不带扩展名的文件名(例如MyApp)。
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
-返回完整路径和文件名(例如C:\ Examples \ Processes \ MyApp.exe)。然后,您可以将其传递给System.IO.Path.GetFileName()
或System.IO.Path.GetFileNameWithoutExtension()
获得与上述相同的结果。
/?
切换)非常有用,因为使用扩展名和路径只会使不必要的混乱。
GetCurrentProcess()
Process.GetCurrentProcess().ProcessName()
为我返回MyApp.vshost。
System.Diagnostics.Process.GetCurrentProcess()
获取当前正在运行的进程。您可以使用该ProcessName
属性找出名称。下面是一个示例控制台应用程序。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Process.GetCurrentProcess().ProcessName);
Console.ReadLine();
}
}
.../bin/mono
* nixes或.../mono.exe
Windows 上的某些变体。
这样就足够了:
Environment.GetCommandLineArgs()[0];
Environment.GetCommandLineArgs()
是最好的答案,因为它是argv
C / C ++ 的确切C#类似物。
Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
这是为我工作的代码:
string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);
上面所有示例为我提供了带有vshost或正在运行的dll名称的processName。
尝试这个:
System.Reflection.Assembly.GetExecutingAssembly()
这将为您返回一个System.Reflection.Assembly
实例,其中包含您可能想知道的有关当前应用程序的所有数据。我认为该Location
物业可能会得到您所追求的目标。
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;
将为您提供应用程序的文件名,例如:“ MyApplication.exe”
还有更多选择:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
不确定或有疑问时,请转圈,尖叫和喊叫。
class Ourself
{
public static string OurFileName() {
System.Reflection.Assembly _objParentAssembly;
if (System.Reflection.Assembly.GetEntryAssembly() == null)
_objParentAssembly = System.Reflection.Assembly.GetCallingAssembly();
else
_objParentAssembly = System.Reflection.Assembly.GetEntryAssembly();
if (_objParentAssembly.CodeBase.StartsWith("http://"))
throw new System.IO.IOException("Deployed from URL");
if (System.IO.File.Exists(_objParentAssembly.Location))
return _objParentAssembly.Location;
if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName))
return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName;
if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location))
return System.Reflection.Assembly.GetExecutingAssembly().Location;
throw new System.IO.IOException("Assembly not found");
}
}
我不能声称已经测试了每个选项,但是它没有做任何愚蠢的事情,例如在调试会话期间返回虚拟主机。
System.Reflection.Assembly.GetEntryAssembly().Location
如果未从内存中加载程序集,则返回exe名称的位置。System.Reflection.Assembly.GetEntryAssembly().CodeBase
返回位置作为URL。如果您正在寻找可执行文件的完整路径信息,那么执行此操作的可靠方法是使用以下命令:
var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
.FileName.Replace(".vshost", "");
这消除了中间dll,vshost等的任何问题。
您可以使用Environment.GetCommandLineArgs()
获取参数和Environment.CommandLine
获取输入的实际命令行。
另外,您可以使用Assembly.GetEntryAssembly()
或Process.GetCurrentProcess()
。
但是,在调试时,请务必小心,因为最后的示例可能会给调试器的可执行文件名称(取决于附加调试器的方式),而不是其他示例所提供的可执行文件。
Environment.CommandLine
至少在Mono / Linux上给出绝对路径,而不是输入的命令行。
这是你想要的吗:
Assembly.GetExecutingAssembly ().Location
在.Net Core(或Mono)上,当定义进程的二进制文件是Mono或.Net Core(dotnet)的运行时二进制文件而不是您感兴趣的实际应用程序时,大多数答案将不适用。 , 用这个:
var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
GetEntryAssembly()
可以返回null。
对于Windows应用程序(窗体和控制台),我使用以下命令:
然后在VS中添加对System.Windows.Forms的引用:
using System.Windows.Forms;
namespace whatever
{
class Program
{
static string ApplicationName = Application.ProductName.ToString();
static void Main(string[] args)
{
........
}
}
}
无论我是在VS中运行实际的可执行文件还是调试程序,这对我来说都是正确的。
请注意,它返回的应用程序名称不带扩展名。
约翰