C# DLL Dynamisch laden (WPF)

Super danke für die Info, jetzt verstehe ich zumindest mal wo das Problem liegt. Klassen und Methoden kann ich ja so via Invoke aufrufen, kann ich die so auch irgendwie in der Appdomain bekannt machen z.B. durch laden via Assembly.load o.Ä.?

Oder kann ich mittels DLLImport auch andere Pfade angeben, dann würde ich den Weg mal testen und die DLL doch in ein temporäres Verzeichnis schreiben und von dort aus laden.

Danke für deine Hilfe!
 
Ich habe eine Lösung gefunden, die auch nicht auf Disk schreiben muss:
C#:
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace test {
    class Program {
        static Program() {
            AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
        }

        static void Main(string[] args) {
            Assembly.Load("Windows.dll");

            Windows.Windows win = new Windows.Windows();

            while (true) {
                Print(win.addieren(3, 5).ToString());
                Console.ReadKey();
            }
        }

        readonly static Dictionary<string, Assembly> _libs = new Dictionary<string, Assembly>();

        static Assembly OnAssemblyResolve(object source, ResolveEventArgs args) {
            Assembly assembly = null;
            String keyName = new AssemblyName(args.Name).Name;
            if (keyName.Contains(".resources"))
                return null;

            if (_libs.ContainsKey(keyName))
                return _libs[keyName];

            String dllName = DllResourceName(keyName);
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(dllName)) {
                if (stream == null) {
                    Print("Error! Unable to find '" + dllName + "'");
                    return null;
                }

                byte[] buffer = new BinaryReader(stream).ReadBytes((int)stream.Length);
                assembly = Assembly.Load(buffer);

                _libs[keyName] = assembly;
                return assembly;
            }
        }

        private static String DllResourceName(String ddlName) {
            if (!ddlName.Contains(".dll"))
                ddlName += ".dll";

            foreach (string name in Assembly.GetExecutingAssembly().GetManifestResourceNames()) {
                if (name.EndsWith(ddlName))
                    return name;
            }
            return ddlName;
        }

        static void Print(String strText) {
            Console.WriteLine(strText);
        }
    }
}

Durch die eigene AssemblyResolve läuft es einwandfrei ! :D

Edit:
Resources->Windows.dll muss auf "Build Action" = "Embedded Resource" gestellt werden, die manuell angehängte dll kannst du löschen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Ghost_Rider_R
Super danke für den Tipp, werde es gleich mal ausprobieren. Ich hab es auch schon in mein eigentliches Projekt integriert, kannst du mir noch sagen, wofür _libs steht? Das kann ich nicht zuordnen:

1539953149143.png

Ergänzung ()

...sorry wer Lesen kann ist klar im Vorteil. Jetzt läuft es hab 1000x Dank für deine Hilfe!!!
 
Zuletzt bearbeitet:
Zurück
Oben