O objeto de processo é representado pela classe System.Diagnostics.Process em .NET. O nome do arquivo do exe atualmente em execução pode ser obtido chamando Process.GetCurrentProcess().MainModule.FileName. Mas este método obtém apenas o nome do arquivo. Se o diretório de trabalho não for alterado durante a execução do programa, você pode chamar o método System.IO.Path para obter o caminho absoluto. No entanto, o diretório atual também pode ser obtido por meio de Environment.CurrentDirectory, e muitos softwares mudarão o diretório de trabalho ao usar o Open Dialog para abrir um arquivo, tornando esse mecanismo ineficaz.
Se estiver em uma aplicação Windows Forms, a aplicação atual também é representada como um objeto System.Windows.Forms.Application Através de suas propriedades estáticas Application.ExecutablePath e Application.StartupPath, o caminho e o caminho de inicialização do arquivo executável podem ser obtidos. .
Mas se não estiver em um aplicativo Windows ou em uma Biblioteca, mesmo que as propriedades do objeto Aplicativo ainda possam ser obtidas, ainda será necessário adicionar uma referência ao Assembly System.Windows.Forms no projeto, o que é muito inconveniente . Neste momento, você pode obter o Assembly atualmente em execução por meio do método estático do Assembly, GetCallingAssembly ou GetExecutingAssembly, e então obter a localização do assembly por meio do Location da classe Assembly.
No entanto, ao usar o Assembly, você pode encontrar problemas de permissão. Ao mesmo tempo, Assembly.GetCallingAssembly ou Assembly.GetExecutingAssembly pode não obter a localização do arquivo .exe. O assembly com um nome forte adicionado ao GAC não precisa estar no mesmo diretório que o .exe durante a execução.
Quando o processo .NET for iniciado, um AppDomain será criado e todo o Assembly será carregado em um determinado AppDomain. O atributo SetupInformation é fornecido no AppDomain, que pode obter algumas informações quando o AppDomain for iniciado. .CurrentDomain.SetupInformation.ApplicationBase obtém o caminho onde o aplicativo atual está localizado.
Depois de obter o diretório necessário por meio do método acima, você pode chamar o método System.IO.Path para obter o nome do arquivo, nome do diretório, caminho absoluto, etc. Pare de analisar strings de caminho e use a classe System.IO.Path.
Ao desenvolver aplicativos em .NET, compreender o relacionamento entre Processo/Aplicativo->AppDomain->Assembly é muito útil para implementar a lógica correta.