C#: Comment puis-je charger dynamiquement/création d'une DLL?
J'ai vu un couple d'exemples qui pourraient peut-être m'aider, mais je n'ai pas beaucoup de temps à explorer comme je viens de constater aujourd'hui que mes patrons ont à la démonstration de cela une semaine plus tôt que prévu, et je tiens à ajouter cette nouvelle fonctionnalité. Je vais essayer et de le garder court et doux.
Ok, c'est comme mon 10ème temps à essayer de droite pour faire clair, j'espère que c'est. C'est une application. Les lignes de données doivent être affichées dans un DataGridView (fait). Certaines lignes sont mis en évidence différemment sur la base des rapports (fait). La plupart des rapports ont leur propre fichier SQL et sont mis en œuvre lors de l'exécution à partir d'un fichier INI (fait). Toutefois, certains rapports besoin d'appeler une Fonction. L'application utilise une base de données SQLite. Je voudrais avoir les Dll qui sont des rapports, toutes de même format, et tous retournent une Liste de ReportRecord. ReportRecord est une classe définie dans mon application principale, mais je voudrais également définir dans chaque DLL lorsqu'ils sont créés. Je veux instancier la DLL, de l'appeler "GetRecords" de la fonction, et l'utiliser dans mon application principale. Voici quelques psuedocode. Les gars si vous pouvez me dire si c'est possible, ou me donner une idée de la meilleure façon de le faire, je l'apprécierais.
PSUEDOCODE
foreach (string str in System.IO.Directory.GetFiles("C:\\ReportDlls", "*.dll"))
{
//Instantiate DLL e.g. newReport
//_lstReportRecords.AddRange(newReport.GetReportRecords());
}
Est-il de toute façon pour ce faire?
Actuellement, j'ai le texte suivant pour compléter jusqu'à ce que j'ai trouver cela:
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();
}
Merci à tous.
Modifier: Désolé les gars, en regardant ce genre de choses honnêtement, je me sens stupide. Comme, mon esprit va vierge et de tous et ne peut pas se concentrer sur elle. 🙂 Ce que vous les gars ont fourni est probablement la meilleure façon, mais depuis que j'ai d'avoir une qualité de Démo prêt d'ici mardi, et il ne devrait pas y avoir plus de rapports ajoutée nécessitant des fonctions jusqu'alors, je vais garder cette ouverture. Une fois que mon patron est hors de la ville à la démo, je vais travailler sur la mise en œuvre de cette. Mais maintenant, il va rester sans réponse, à moins que je vois un exemple qui est très très (pour 2 ans) vers l'avant.
OriginalL'auteur XstreamINsanity | 2010-09-09
Vous devez vous connecter pour publier un commentaire.
Ne regarde pas cela en termes de DLL, qui sont des fichiers raw, mais des Assemblées, qui est de savoir comment .NET voit les choses. Vous pouvez charger un Assembly à l'aide de
Assembly.Load
. Ceci dit, avez-vous plus de solution générique, comme l'inversion de contrôle?Dans ce contexte, l'Inversion de Contrôle est un moyen de transmettre les dépendances de votre rédacteur du rapport. Au lieu d'utiliser un
switch
instruction afin de déterminer la source de données, il vous suffit de passer la source de données à l'RefreshReports
méthode en tant que paramètre.J'ai ajouté un lien. Fondamentalement, le besoin de comprendre à l'exécution seulement la mise en œuvre d'un problème que les gens ont créé des solutions d'ores et déjà. Pour .NET en particulier, regardez: eduncan911.com/blog/...
Je sens une de deux choses. Soit perdu, ou qu'il aura beaucoup de réécriture pour l'obtenir de cette façon. Je ne suis pas sûr. 🙂 Il y a un ListView (cases à cocher) et ils choisissent ce qu'ils veulent voir, parfois plusieurs à la fois. Chaque état a sa propre instruction SQL. C'est pourquoi cette fonction supprime les éléments d'une liste des membres, puis ajoute le dos encore délinquance des dossiers. Désolé si je fais ce plus confuse qu'elle ne l'était déjà. Je sais ce que je veux faire dans ma tête, je ne sais pas comment le dire.
Boucle à travers la DLL dans un répertoire particulier, peut-être de filtrage sur la base du nom, et la charge de chacun d'eux comme un ensemble. Utiliser la réflexion pour marcher à travers les classes et trouver ceux qui sont marqués avec un attribut et/ou mettre en œuvre une interface particulière. Pour chaque classe, l'instancier et appeler une méthode. Rincez, répétez.
OriginalL'auteur Steven Sudit
Vous pouvez simplement créer un C# bibliothèque de projet de mise en œuvre les interfaces ci-dessous et de stocker le fichier binaire dans la base de données ou sur le système de fichiers. Vous pouvez ensuite charger l'assembly à partir de matières de l'assemblée octets/chemin d'accès au fichier un instancier un objet. Avec réflexion, vous pouvez également appeler le constructeur directement, mais je préfère le modèle de fabrique pour de telles tâches.
OriginalL'auteur Nappy
Je ne suis pas vraiment à comprendre exactement ce que vous êtes en train de faire, et le CIO est probablement la voie à suivre ici. Mais ce que je comprends, vous pourrait le faire avec de la pure réflexion.
Vous l'esprit, c'est loin d'être le moyen idéal de faire des choses comme cela, mais vous êtes le demander 🙂
Ici, il va (du haut de ma tête, afin de ne pas tirer sur moi si quelque chose est incorrect, il devrait être assez proche, mais pas infaillible)
OriginalL'auteur Bertvan
Envisager une architecture de plugin, comme le Managed Extensibility Framework, pour la gestion de votre rapport de modules.
OriginalL'auteur Robert Harvey
Vous pouvez envisager d'utiliser le Managed Extensibility Framework pour cela. Il rend ce type d'opération triviale.
Vous pouvez télécharger ci-dessus .NET 3.5 (c'est dans le cadre .NET 4 déjà). En utilisant MEF, vous pouvez simplement importer la collection de tous exporté "rapports" d'un seul coup par l'intermédiaire d'un DirectoryCatalog, et il prendra soin de tout le câblage pour vous.
Pour plus de détails, consultez l'aide sur L'importation des Collections ici.
OriginalL'auteur Reed Copsey