title: C#: How do I dynamically load/instantiate a DLL?
body: <p>I've seen a couple examples out there that could possibly help me, but I don't have that much time to explore them as I just found out today that my bosses have to demo this a week earlier than planned, and I want to add this new functionality.  I'll try and keep this short and sweet.</p>
  
  <p>Ok, this is like my 10th time trying to right this to make it clear, hopefully it is.  This is an application.  Rows of data need to be displayed in a DataGridView (done).  Some rows are highlighted differently based on reports (done).  Most reports have their own SQL file and are implemented at runtime from an INI file (done).  However, some reports need to call a Function.  The application is using an SQLite database.  I would like to have DLLs that are reports, all of the same format, and all of them return a List of ReportRecord.  ReportRecord is a class defined in my main application but I would also define it in each DLL when they are created.  I want to instantiate the DLL, call it's "GetRecords" function, and use it in my main application.  Here is some psuedocode.  If you guys can tell me if it's possible, or give me an idea of a better way to do this, I'd appreciate it.</p>
  
  <p>PSUEDOCODE</p>
  
  <pre><code> foreach (string str in System.IO.Directory.GetFiles("C:\\ReportDlls", "*.dll"))
   {
     //Instantiate DLL e.g. newReport
     //_lstReportRecords.AddRange(newReport.GetReportRecords());
   }    
  </code></pre>
  
  <p>Is there anyway to do this?</p>
  
  <p>Currently, I have the following to supplement until I find this out:</p>
  
  <pre><code>        private void RefreshReports(string strReportTitle)
          {
              _lstReportRecords = _lstReportRecords.Where(rr =&gt; rr.Description != strReportTitle).ToList&lt;ReportRecord&gt;();
              string strColumn = iniFile.GetString(strReportTitle, "Column", "");
  
  
              if (strColumn != null)
              {
                  _lstReportRecords.AddRange(_dataController.BuildReportList(strColumn, strReportTitle, GetReportSQL(strReportTitle)));
              }
              else
              {
                  switch (strReportTitle)
                  {
                      case "Improper Indenture":
                          _lstReportRecords.AddRange(_dataController.ImproperIndenture());
                          break;
                      case "Skipping Figure":
                          _lstReportRecords.AddRange(_dataController.SkippingFigure());
                          break;
                      default: break;
                  }
              }
              FormatCells();
          }
  </code></pre>
  
  <p>Thanks everyone.</p>
  
  <p><b>Edit</b>: Sorry guys, looking at that stuff is honestly making me feel stupid.  Like, my mind is going blank and all and can't concentrate on it.  :)  What you guys have provided is probably the best way, but since I have to have a quality Demo ready by Tuesday and there shouldn't be any more reports added needing functions until then, I'm going to keep this open.  Once my boss is out of town to demo it, I'll work on implementing this.  But right now, it's going to go unanswered unless I see an example that is very very (for 2 year olds) straight forward.</p>