Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best way to get the directory from which an assembly is executing

Tags:

For my apps, I store some configuration file in xml along with the assembly(exe), and something other temporary files for proccessing purpose.

I found some quirk with ".\\" and Application.StartupPath.

I've been using

String configPath = ".\\config.xml"; 

It works fine until I called OpenFIleDialog to open some files in other folders, the statement above failed. Apparently ".\" is referring to "CurrentDirectory", which changes every time when we browse to another folder.

At some point, I was using

String configPath = Path.Combine(Application.StartupPath + "config.xml"); 

At some point, when I need to execute this assembly from another folder by using Process.Start(), things start to fall apart. Apparently the working directory is not set properly, and Application.StartupPath is actually referring to working directory instead of the directory of which the assembly is executing, as I've assumed. So I have to resort to using ProcessInfo to setup the working directory to the assembly's directory. I also had problem with this when I was writing VSTO.

So, my question is, what's the best, simplest and most assured way to get the current directory that the assembly is executing, without those quirks(or misunderstanding) that I've just mentioned?

EDIT: I meant to get the directory which the assembly reside

EDIT: According to MSDN on AppDomain.BaseDirectory, it seems that it can be changes during runtime, which is what I don't want(Just to clarify, not that I don't want to allow changing BaseDirectory, but rather, when I retrieve it without knowing for sure whether it's been changed)

EDIT: I've notice that a related question was posted much earlier. What would cause the current directory of an executing app to change?

Thanks guys for the answer.

like image 496
faulty Avatar asked Oct 31 '08 13:10

faulty


2 Answers

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)) 
like image 53
korro Avatar answered Oct 19 '22 04:10

korro


Try the implementation below. The CodeBase property is the most reliable way to get the location, and then the rest of the code converts it into standard Windows format (instead of a URI).

static public string AssemblyLoadDirectory {     get     {         string codeBase = Assembly.GetCallingAssembly().CodeBase;         UriBuilder uri = new UriBuilder(codeBase);         string path = Uri.UnescapeDataString(uri.Path);         return Path.GetDirectoryName(path);     } } 
like image 24
John Sibly Avatar answered Oct 19 '22 04:10

John Sibly