myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Wie kann ich eine Assembly dynamisch laden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich eine Assembly dynamisch laden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
C-sharper96 C-sharper96 ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.09.2019
Beiträge: 4
Entwicklungsumgebung: VS 2017 Prof.
Herkunft: Bayern


C-sharper96 ist offline

Wie kann ich eine Assembly dynamisch laden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo liebe Community

Ich arbeite gerade an einem Projekt, welches 3 unterschiedliche APIs verwendet.
Jetzt brauche ich von API 1 Verweise die versionsabhängig sind. Sprich, wenn ich über eine Eingabe der GUI angebe das ich Version 1.4 von dem externen Programm verwende, soll mein Programm die passenden Verweise aus dem jeweiligen Bin-Ordner laden.
Leider sind die Verweise nicht kompatibel mit anderen Versionen, ich kann also nicht den Verweis für Version 1.8 im Programm nutzen wenn ich von dem externen Programm Version 1.7 oder 1.9 nutze usw.

Damit lade ich ja die DLLs von den jeweiligen Pfaden:

C#-Code:
        dataModelPath = @"C:\BeispielOrdner\Version x.y\DataModel.dll";
        basePath = @"C:\BeispielOrdner\Version x.y\Base.dll";
        systemPath = @"C:\BeispielOrdner\Version x.y\System.dll";

        private static void LoadAssemblys(string dataModelPath, string basePath, string systemPath)
        {
            Assembly dataModelAssembly = Assembly.LoadFile(dataModelPath);
            Assembly baseAssembly = Assembly.LoadFrom(basePath);
            Assembly systemAssembly = Assembly.LoadFrom(systemPath);
        }

Soweit so gut, jetzt brauche ich allerdings Typen, die in den jeweiligen Verweisen existent sind.
z.B. Type Function.
Dadurch das ich die Verweise dynamisch laden möchte, kennt Visual Studio ja aber diese nicht, bis ich LoadAssembly(...) ausgeführt habe und gibt den Fehler aus, dass es den Typen Function nicht gefunden hat. Using-Direktiven funktionieren ja genauso wenig...
Wie bekomm ich das jetzt hin? Meine Verweise versionsabhängig laden und Visual Studio sagen, das diese vorhanden sind? verwundert

Zusätzlicher Code zum Beispiel Function:

C#-Code:
using DataModel;

        public void DoSomething (Function actualFunction, bool isSubBox)
        {
            Function mainFunc = null;
            Function overviewFunc = null;
            foreach (var function in actualFunction.MergedDeviceFunction.MergedObjects.Where(o => o is PLC).Cast<PLC>())
            {
                if (function.IsMainFunction) mainFunc = function;
                else if (function.PLCTerminals.Any() && !isSubBox) overviewFunc = function;
                else if (isSubBox) overviewFunc = null;
            }
        }

Dabei ist
- Function Bestandteil von DataModel
- PLC Bestandteil von DataModel.EObjects

Mit freundlichen Grüßen

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von C-sharper96 am 24.09.2019 14:43.

Neuer Beitrag 24.09.2019 14:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.060
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Im Prinzip willst Du sowas  [FAQ] Eigene Anwendung pluginfähig machen
Wenn Du kein Entladen von Assemblies brauchst (was es in der Form auch in .NET Core/.NET 5 nicht mehr gibt, da es hier keine AppDomain mehr zum Verwerfen gibt), kannst Du das auch theoretisch einfacher via Dependency Injection und verschiedenen Implementierungen lösen.
Dann hast dieses Grundproblem nicht.
Neuer Beitrag 24.09.2019 14:44 Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.594
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Abt,

Zitat:
kein Entladen von Assemblies brauchst (was es in der Form auch in .NET Core/.NET 5 nicht mehr gibt

mit den AppDomains hast du recht. Entladen von Assemblies geht ab .NET Core 3.0 wieder und zwar mit Hilfe vom  AssemblyLoadContext (ein Beispiel ist  hier).

mfG Gü
Neuer Beitrag 24.09.2019 18:30 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 17.10.2019 07:06