Laden...

Wie kann ich eine Assembly dynamisch laden?

Erstellt von C-sharper96 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.561 Views
C
C-sharper96 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren
Wie kann ich eine Assembly dynamisch laden?

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:


        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? 🤔

Zusätzlicher Code zum Beispiel Function:


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

16.806 Beiträge seit 2008
vor 4 Jahren

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.

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo Abt,

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ü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"