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.
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
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); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With