C#: Wie kann ich dynamisch laden/instanziieren eine DLL?
Ich habe gesehen, ein paar Beispiele gibt, dass könnte eventuell helfen mir, aber ich habe nicht viel Zeit, Sie zu entdecken, wie ich gerade herausgefunden heute, dass meine Chefs haben für diese demo eine Woche früher als geplant, möchte ich hinzufügen, dass diese neue Funktionalität. Ich werde versuchen, und halten Sie diese kurz und süß.
Ok, das ist wie mein 10 mal versucht, dies richtig klar zu machen, hoffentlich ist es. Dies ist eine Anwendung. Datenzeilen angezeigt werden müssen in einem DataGridView (fertig). Einige Zeilen werden unterschiedlich dargestellt anhand der Berichte (gemacht). Die meisten Berichte haben Ihre eigenen SQL-Datei und implementiert werden zur Laufzeit aus einer INI-Datei (fertig). Aber, einige Berichte nennen eine Funktion. Die Anwendung verwendet eine SQLite-Datenbank. Ich möchte DLLs, die Berichte, die alle das gleiche format, und alle von Ihnen gibt eine Liste von ReportRecord. ReportRecord ist eine Klasse definiert, die in meinem Haupt-Anwendung würde ich aber auch definieren, die es in jeder DLL, wenn Sie erstellt werden. Ich will erstellen der DLL, nennen es "GetRecords" - Funktion, und verwenden Sie es in meine Haupt-Anwendung. Hier einige psuedocode. Wenn Euch kann mir sagen, ob es möglich ist, oder geben Sie mir eine Idee für einen besseren Weg, dies zu tun, ich würde es zu schätzen wissen.
PSUEDOCODE
foreach (string str in System.IO.Directory.GetFiles("C:\\ReportDlls", "*.dll"))
{
//Instantiate DLL e.g. newReport
//_lstReportRecords.AddRange(newReport.GetReportRecords());
}
Gibt es trotzdem, dies zu tun?
Heute habe ich das folgende zu ergänzen, bis ich dies herausfinden:
private void RefreshReports(string strReportTitle)
{
_lstReportRecords = _lstReportRecords.Where(rr => rr.Description != strReportTitle).ToList<ReportRecord>();
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();
}
Danke an alle.
Bearbeiten: tut mir Leid Jungs, schaut auf das Zeug ist ehrlich gesagt macht mich fühle mich dumm. Wie, mein Geist geht leer und alle und kann nicht konzentrieren sich auf es. 🙂 Was Euch zur Verfügung gestellt haben, ist wahrscheinlich der beste Weg, aber da habe ich eine Qualität Demo fertig, bis Dienstag, und es sollte nicht mehr Berichte Hinzugefügt, die benötigen Funktionen, bis dann, ich werde halten Sie diese öffnen. Einmal mein Chef ist aus der Stadt, um die demo, werde ich die Arbeit an der Umsetzung dieser haben. Aber jetzt, es wird unbeantwortet bleiben, es sei denn, ich ein Beispiel sehen, dass sehr, sehr (für 2 jährige) straight forward.
- Ich bitte Euch, bitte bewahren Sie diese öffnen, zumindest bis zu diesem Wochenende, wenn ich Zeit haben, gehen über diese. Ich möchte halten Sie die links-und die Leute, die mich darüber informiert, Sie können mir weiter helfen. Bitte, bitte, bitte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schauen Sie nicht auf diese im Sinne von DLL-Dateien, die die raw-Dateien, sondern Versammlungen, die ist, wie .NET die Dinge sieht. Können Sie laden eine Assembly mit
Assembly.Load
. Nachdem dies gesagt ist, haben Sie als eine allgemeinere Lösung, wie inversion of control?switch
- Anweisung, um zu bestimmen, die Quelle der Daten, würden Sie einfach übergeben Sie die Daten Quelle derRefreshReports
Methode als parameter.Können Sie einfach erstellen Sie eine C# - Bibliothek-Projekt-Umsetzung der Schnittstellen unter und speichern Sie die Binärdatei in die Datenbank oder auf das Dateisystem. Sie könnten dann laden Sie die Montage von raw-Baugruppe Byte/Datei-Pfad ein instanziieren eines Objekts. Mit der Reflexion können Sie auch rufen den Konstruktor nicht direkt, aber ich bevorzuge das Werk Muster für solche Aufgaben.
Bin ich nicht wirklich verstehen, was genau Sie zu tun versuchen, und IOC ist wahrscheinlich der Weg zu gehen hier. Aber von dem was ich verstehe, Sie könnte dies mit der reinen Reflexion.
Wohlgemerkt, dies ist weit von der idealen Weise zu tun, Dinge wie diese, aber du hast danach gefragt 🙂
Hier geht es (oben auf meinem Kopf, also nicht auf mich Schießen, wenn etwas falsch ist, sollte es ziemlich eng, obwohl nicht narrensicher)
Betrachten Sie eine plugin-Architektur, wie die Managed Extensibility Framework, die für die Verwaltung Ihren Bericht Module.
Möchten Sie vielleicht zu prüfen, mit der Managed Extensibility Framework für diese. Es macht diese Art der operation trivial.
Den download finden Sie oben .NET 3.5 (es ist in dem Rahmen, in .NET 4 schon). Durch die Verwendung von MEF, können Sie einfach importieren Sie die Auflistung aller exportierten "Berichte" in one shot über eine DirectoryCatalog, und es wird, übernehmen die Verkabelung für Sie.
Details finden Sie in der Hilfe auf Import von Sammlungen hier.