29

I've been looking around but I have not found a solution for this problem: I want to create a class library that has a configuration file under a sub-directory called Configuration. I want that class library to be deployed anywhere and I want it to find its configuration files by knowing its own location.

Previous attempts with Assembly.GetExecutingAssembly().Location did not work.
It would return temp locations such as

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\7c00e0a3\38789d63\assembly\dl3\9c0a23ff\18fb5feb_6ac3c901

instead of the desired

bin/Configuration path.

So:

  1. Can a class library be aware of its own location on disk?
  2. How would I go about witting test scripts for this functionality since it seems that directories change based on how you run the app (debugging inside VS, deploying on IIS, etc)
lexeme
  • 2,915
  • 10
  • 60
  • 125
nandos
  • 1,207
  • 2
  • 11
  • 20
  • Why not include the configuration in the application's app.config file and use ConfigurationManager in your class libraries? – Justin Niessner Apr 22 '09 at 17:08
  • You might want to clarify your question (for better searchability later) that this is ASP.NET. For desktop applications, GetExecutingAssembly() works just fine. – Stu Apr 22 '09 at 17:11
  • 1
    @Justin: I want the Class Library to be independent of the caller application. @Stu: Both. I want to create a class library that could be used for both Console Apps and Web Apps. The class library should not care about who's calling it. – nandos Apr 22 '09 at 17:20

2 Answers2

46

This should work -

string assemblyFile = (
    new System.Uri(Assembly.GetExecutingAssembly().CodeBase)
).AbsolutePath;
xsl
  • 17,116
  • 18
  • 71
  • 112
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
3

The below code worked for me to get the physical path of the Images folder in-class library file.

string fullFilePath = Path.Combine((new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath.Split(new string[] { "/bin" }, StringSplitOptions.None)[0]
                          , "@/Images/test.png");

I hope, it will help someone.

Rajeev Kumar
  • 371
  • 2
  • 9