Ответ 1
System.AppDomain.CurrentDomain.FriendlyName
Я хочу получить имя текущей запущенной программы, то есть исполняемого имени программы. В C/С++ вы получаете его от args[0]
.
System.AppDomain.CurrentDomain.FriendlyName
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()
для достижения тех же результатов, что и выше.
System.Diagnostics.Process.GetCurrentProcess()
получает текущий процесс. Вы можете использовать свойство ProcessName
для определения имени. Ниже приведен пример консольного приложения.
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Process.GetCurrentProcess().ProcessName);
Console.ReadLine();
}
}
Этого должно быть достаточно:
Environment.GetCommandLineArgs()[0];
Это код, который работал у меня:
string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);
Все приведенные выше примеры дали мне имя процесса с именем vshost или запущенным именем dll.
Попробуйте следующее:
System.Reflection.Assembly.GetExecutingAssembly()
Это возвращает вам System.Reflection.Assembly
экземпляр, в котором есть все данные, которые вы когда-либо хотели узнать о текущем приложении. Я думаю, что свойство Location
может получить то, что вам нужно.
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;
предоставит вам имя_файла вашего приложения; "MyApplication.exe"
Почему никто не предлагал это, просто.
Path.GetFileName(Application.ExecutablePath)
Пара дополнительных параметров:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
System.Reflection.Assembly.GetEntryAssembly().Location
возвращает местоположение имени exe, если сборка не загружена из памяти.System.Reflection.Assembly.GetEntryAssembly().CodeBase
возвращает местоположение как URL.Когда вы сомневаетесь или сомневаетесь, бегите кругами, кричите и кричите.
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");
}
}
Я не могу утверждать, что тестировал каждый параметр, но он не делает ничего глупого, как возвращение vhost во время сеансов отладки.
Если вам нужно имя программы для настройки правила брандмауэра, используйте:
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
Это гарантирует правильность имени при отладке в VisualStudio и при запуске приложения непосредственно в окнах.
Если вы ищете полную информацию о пути своего исполняемого файла, надежный способ сделать это - использовать следующее:
var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
.FileName.Replace(".vshost", "");
Это устраняет любые проблемы с промежуточными dll, vshost и т.д.
Вы можете использовать Environment.GetCommandLineArgs()
для получения аргументов и Environment.CommandLine
, чтобы получить фактическую командную строку, введенную.
Кроме того, вы можете использовать Assembly.GetEntryAssembly()
или Process.GetCurrentProcess()
.
Однако при отладке вы должны быть осторожны, так как этот последний пример может дать вам исполняемое имя отладчика (в зависимости от того, как вы прикрепляете отладчик), а не от вашего исполняемого файла, как и другие примеры.
Это то, что вы хотите:
Assembly.GetExecutingAssembly ().Location
Для приложений Windows (форм и консоли) я использую это:
Добавьте ссылку на System.Windows.Forms в VS, затем:
using System.Windows.Forms;
namespace whatever
{
class Program
{
static string ApplicationName = Application.ProductName.ToString();
static void Main(string[] args)
{
........
}
}
}
Это правильно работает для меня, выполняю ли я фактический исполняемый файл или отладку в VS.
Обратите внимание, что он возвращает имя приложения без расширения.
Джон
Попробуйте Application.ExecutablePath
Супер легкий, здесь:
Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName
В .Net Core (или Mono) большинство ответов не будут применяться, когда двоичный файл, определяющий процесс, представляет собой двоичный файл времени исполнения Mono или .Net Core (dotnet), а не ваше фактическое приложение, которое вас интересует. В этом случае используйте это:
var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
Это работает, если вам нужно только имя приложения без extensio:
Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);