PluginLib [2.1]

    • Release

    Es gibt 125 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

      Ah, das ist natürlich nicht so toll.
      Da ich das sozusagen als Modul erweiterung nutzen möchte.
      Ich nutze ja Lua in meinem Programm, da kann man ja selber funktionen hinzufügen. Nun wollte ich, das jede Funktion dann ausgelesen wird und in Lua eingetragen wird.
      gibts da iwie ne alternative oder eine andere Lösung?
      Also, in Lua kann man selbst funktionen hinzufügen.
      Ich möchte nun alle Funktionen die Jetzt in meinem Programm stehen in Dlls schreiben, damit auch User selbst Module dafür schreiben können.
      Dann möchte ich alle Dlls in dem ordner Modules auslesen lassen und in Lua Registrieren. Das geht mit registervalues("function") (Als String)
      Ist aber in C#, gerade keine wirkliche lust das wieder umzuschreiben:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. DirectoryInfo dinfo = new DirectoryInfo("modules/");
      2. FileInfo[] files = dinfo.GetFiles("*.dll");
      3. foreach (var f in files) {
      4. string p = f.FullName;
      5. Assembly SampleAssembly;
      6. Type[] Types = null;
      7. Type modul = null;
      8. SampleAssembly = Assembly.LoadFile(p);
      9. Types = SampleAssembly.GetTypes();
      10. foreach (Type i in Types)
      11. {
      12. if ((i.Name == "Plugin"))
      13. {
      14. modul = i;
      15. break;
      16. }
      17. }
      18. ObjectHandle a = Activator.CreateInstanceFrom(p, modul.FullName);
      19. MethodInfo[] functionen = null;
      20. functionen = (System.Reflection.MethodInfo[])modul.GetMethods();
      21. string[] funktionen = ((string[])modul.GetMethod("Functions").Invoke(null, null)); ' functions ist eine funktion in der Assembly
      22. richTextBox1.Text += modul.FullName + "\r\n";
      23. richTextBox1.Text += "------------- \r\n";
      24. for (int i = 0; i <= funktionen.Length - 1; i++)
      25. {
      26. lua.RegisterFunction(modul.GetMethod(funktionen[i]).Name, this, modul.GetMethod(funktionen[i]));
      27. richTextBox1.Text += modul.GetMethod(funktionen[i]).Name+"\r\n";
      28. }
      29. }

      Hi,

      erstmal Respekt und Anerkennung an dich, Chrisber, für diese tolle ClassLibrary. Ich nutze sie schon erfolgreich in meinem Programm. Ich würde mir jetzt aber gerne noch eine Funktion wünschen, von welcher ich der Meinung bin das sie auch wirklich dazu gehört. Dies wäre die Funktion geladene Plugins während der Laufzeit wieder entladen zu können. Sprich eine Art "UnLoad" Funktion.

      Über diese Funktion würde ich mich sehr freuen.


      Gruß,
      FaltyR
      Auf Wunsch von FaltyR wurde die entsprechende Funktion eingebaut.
      Lädt man ein Plugin via "LoadPlugin(Pfad, false)" so wird die DLL erst ausgelesen und dann als Assembly geladen.
      So entfällt der Zugriff auf die Datei und diese kann während das Plugin noch geladen ist, problemlos bearbeitet oder gelöscht werden.

      Gruß
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Hey, du könntest mal eine kleine Doku schreiben ;)

      Ganz ehrlich, trotz Sample hab ich noch nicht verstanden, wieso ich zur Initialisierung der Manager-klasse einen Namespace und Klassen-Name
      angeben muss, geschweige denn, für was der gut sein soll und von was denn überhaupt.

      Du könntest da mal ein wenig genauer erklären wie das ganze Prinzip funktioniert ;)

      MfG
      R
      Also, nach Erlaubnis hab ich im Reflector mal das ganze angeschaut.
      Ich hab hier was gefunden, was man noch eventuell optimieren könnte, und einen mehr oder weniger fatalen Fehler.

      Du nutzt beim Laden der Plugins durch auslesen und speichern in ein Array Goto´s. Ich bin mir nicht sicher,
      aber ich hab mal gehört, dass das nicht die schöne Art ist (keine Ahnung, ist das performance-mäßig schlecht oder wie?).
      Man könnte dies statt goto und if mit einem einfachen (do-)While machen ;)


      Nun zum Fehler: Nach genauerem durchsuchen hab ich rausgefunden wieso man Klasse und Namespace angeben muss.
      Erstens: Ich finde es irgendwie dumm, da nicht jedes Plugin den selben Namespace und Klasse hat. Hab das nicht genau angeschaut
      aber irgendwie kommt mir das so vor, als würde das etwas kompliziert sein und nicht wirklich Sinn machen.

      Aber der Fehler liegt hier: Du suchst einen Typ in der Assembly in Abhänigkeit des Dateinamens. Somit, wenn man die DLL umbenennt findet er
      die Klasse nicht mehr.

      VB.NET-Quellcode

      1. Dim newValue As String = strArray((strArray.Length - 1)).Replace(".dll", "")
      2. type = [assembly].GetType((Me.m_sNamespace.Replace("$plugin", newValue) & "." & Me.m_sClass.Replace("$plugin", newValue)))


      Ich hoff das ist kein Problem wenn ich das jetzt rausschreib. Aber wie man sieht beziehst du den Plugin-Namen vom Dateinamen.
      Wenn die Klasse aber anders heißt als die Datei, kann das ganz schnell schief gehen ;)

      Sofern du eine andere Lösung findest, als den Dateinamen zu verwenden, würde das ganze wieder einwandfrei funktionieren ;)


      MfG
      R