Laden...

Bei "Plugins" Probleme mit Assembly

Erstellt von RitterChristian vor 16 Jahren Letzter Beitrag vor 16 Jahren 813 Views
R
RitterChristian Themenstarter:in
137 Beiträge seit 2007
vor 16 Jahren
Bei "Plugins" Probleme mit Assembly

Hallo,

habe hierzu nichts passendes in der forumsuche gefunden, also will ich mal 😉

Ich habe dank des Beispiels unter http://www.codeproject.com/KB/cs/pluginsincsharp.aspx
meine EditorTools beliebig erweiterbar gemacht, funktioniert auch super.

Initialisierung etc. geht einwandfrei, aber:

Szenario:

  • Ein Editor (MenuScreenEditor) erlaubt, Menus visuell zu gestalten, welche dann durch Kompilierbefehl in die korrekten Klassen der Engine translatiert werden (muss ich noch schauen wie ich das mache, NICHT das eigentliche problem hier).
  • speichern klappt
  • Laden nicht

Wenn ich das dokument lade, kommt das (Auszug aus meiner Logdatei):

ERR: 28.02.2008 14:58:59 | [MenuScreenEditor] Error occured while loading file!
ERR: 28.02.2008 14:58:59 | [MenuScreenEditor] Details: 'Die Assembly MenuScreenDesigner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden.'.
ERR: 28.02.2008 14:59:02 | [MenuScreenEditor] Error occured while loading file!
ERR: 28.02.2008 14:59:02 | [MenuScreenEditor] Details: 'Die Assembly MenuScreenDesigner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null kann nicht gefunden werden.'.

Wieso Assembly fehler? Laden des Plugins "MenuScreenDesigner.dll" klappt doch offenbar einwandfrei, aber wenn ich das gespeicherte ".kdesigner" dokument lade, kommt der Fehler 🙁

Bin schon nahezu am verzweifeln, erst klappt alles so gut und reibungslos, und dann das 🙁

Weiß auch nicht was ich hier machen soll, Hilfe ist gerne willkommen 🙂

Danke,
chris

EDIT: Load Code:


if ( this._unsafedContent ) {
        // TODO: Notify user!
      } else {
        OpenFileDialog open = new OpenFileDialog();
        open.Filter = FILE_FILTER_KMS_DESIGN;
        open.Title = "Load Designer Menu Screen File...";
        open.InitialDirectory = Application.StartupPath;
        if ( open.ShowDialog() == DialogResult.OK ) {

          if ( MSEFiles.MSEFileFunctions.LoadMSEFile( open.FileName ,
            this.menuScreenDesignerPanel1 , this.hrtbCode ) ) {
            this.menuScreenDesignerPanel1.Refresh();

            // append to our recents (if not in already)
            if ( !this._recentlyLoadedFiles.Contains( open.FileName ) )
              this._recentlyLoadedFiles.Add( open.FileName );

            // check for (maybe) a trans table file with the same name but different extension
            string transFile = Path.GetFileNameWithoutExtension( open.FileName );
            transFile += ".trans";
            this._hasTransTableFile = ( File.Exists( transFile ) );

            this._loadedFile = open.FileName;
            this._unsafedContent = false;
            this._saved = true;
          }
        }

EDIT2: Aufgerufende Methode

 public static bool LoadMSEFile( string filename , MenuScreenDesignerPanel pnl,
      HighlightingRichTextBox hrtbCode) {

      Stopwatch sw = new Stopwatch();
      sw.Start();


      // we try it binary now
      FileStream stream = new FileStream( filename , FileMode.Open , FileAccess.Read );
      //BinaryWriter bw = new BinaryWriter( stream );
      BinaryFormatter bf = new BinaryFormatter();


      bool result = false;
      string err0 = "";
      string err1 = "";

      try {

        // Grab the MenInformation and serialize THAT!       
        // load them in
        pnl.MenInformation = (MenuScreenInformation)bf.Deserialize( stream );
        // and gather the elements out from it
        pnl.BaseClasses = pnl.MenInformation.Elements;

        KDesignerPanel.SetDependentPanel( pnl.BaseClasses , pnl );
        // also select none
        pnl.DenyAllSelections();

        // now load the code into the hrtb
        LoadCodeFile( filename , hrtbCode );
        result = true;
      } catch ( Exception ex ) {
        err0 = "Error occured while loading file!";
        err1 = String.Format( "Details:  '{0}'." , ex.Message );
        
        result = false;
      } finally {
        stream.Close();
        sw.Stop();
      }


      if ( result ) {
        string dur = String.Format( "Loaded MenuScreen file (took '{0}' ms)." , sw.ElapsedMilliseconds.ToString() );
        KETLogging.LogMessageToListView( GlobalVariables.MAINFORM.lsvLogging ,
           K_Engine.Logging.ELoggingMessageType.Info , dur , "MenuScreenEditor" );
      } else {

        KETLogging.LogMessageToListView( GlobalVariables.MAINFORM.lsvLogging ,
           K_Engine.Logging.ELoggingMessageType.Error , err0 , "MenuScreenEditor" );
        KETLogging.LogMessageToListView( GlobalVariables.MAINFORM.lsvLogging ,
           K_Engine.Logging.ELoggingMessageType.Error , err1 , "MenuScreenEditor" );

      }

      return result;

    }

Projekte:
http://code.google.com/p/freeminerdotnet/ - MMORPG-Maker im grafischen Stile von Minecraft
http://code.google.com/p/directzzt/ - ZZT Remake mit eigenen Ideen

915 Beiträge seit 2006
vor 16 Jahren

Der Code sieht zumindest sauber aus - vergewissere dich das in deiner .kdesigner Datei die Klasse MenuScreenEditor vom Typ MenuScreenInformation abgeleitet wurde oder falls es ein Interface sein sollte dieses implementiert. Ebenso ob einen parameterlosen public Konstruktor in der Klasse MenuScreenEditor vorhanden ist.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

R
RitterChristian Themenstarter:in
137 Beiträge seit 2007
vor 16 Jahren

Hallo,

der Punkt ist doch der, dass als ich es in meiner K_EditorTools assembly drinhatte, alles noch funktionierte und seit ich dass ich einer eben "plugin-assembly" drinhabe, das laden nicht funzt, dabei hab ich den Code nicht geändert 🙁

Das kann nicht sein, es ist bestimmt wieder einer dieser "nadel im heuhaufen" bugs oder was-auch-immer....

Projekte:
http://code.google.com/p/freeminerdotnet/ - MMORPG-Maker im grafischen Stile von Minecraft
http://code.google.com/p/directzzt/ - ZZT Remake mit eigenen Ideen

915 Beiträge seit 2006
vor 16 Jahren

Na ja, ansonsten hast in deinen AddOns/Addins wirklich immer nur eine Klasse drinnen?

Den mit (MenuScreenInformation)bf.Deserialize( stream ); gehst davon schon aus.

Würde doch eher das anstreben wie es im Linkt von Codeproject gelöst wurde. Finde den Weg viel sauberer, auch wenn es mehr Zeit kostet das nun nachträglich einzufügen (naja 1/2 -1 Tag). Vorallem kann man dort anhand von Abfragen schon prüfen, ob das Plugin überhaupt geladen werden kann, statt mit einen try catch 🙂

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(