Announcement

Collapse
No announcement yet.

System.TypeInitializationException wurde nicht behandelt.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • System.TypeInitializationException wurde nicht behandelt.

    Hallo an alle Leser,
    ich habe ein Problem, womit ich einfach nicht weiter komme. Ich habe dazu auch Google/Bing befragt allerdings bin ich mit den Ergebnissen auch nicht weiter gekommen. Vielleicht denke ich aber auch nur einfach zu kompliziert.
    Ich habe ein Anwendung, welche als GUI dient und einen neuen Thread startet (Server für eine spezielle Aufgabe). Unter anderem wird dann die Funktion Reload aufgerufen:[Highlight=c#]public static class ServerInit
    {
    public static Boolean Reload()
    {
    #region # Load data #

    ServerData.Paths.Add(MCServePaths.FOLDER_LOGS, Assembly.GetExecutingAssembly().Location + "\\logs");
    ServerData.Paths.Add(MCServePaths.FOLDER_PLUGINS, Assembly.GetExecutingAssembly().Location + \\plugins);[/Highlight]MCServePaths ist ein enum aus einer anderen Bibliothek:[highlight=c#]public enum MCServePaths {
    SETTINGS,
    LIST_BANNED_IPS,
    LIST_BANNED_PLAYERS,
    LIST_OPS,
    LIST_WHITELIST,
    LOG_SERVER,
    LOG_MESSAGES,
    LOG_WARNING,
    LOG_ERRORS,
    FOLDER_PLUGINS,
    FOLDER_LOGS,
    FOLDER_SETTINGS,
    FOLDER_WORLDS
    }[/highlight]ServerData.Paths ist vom Typ Dictionary<MCServePaths, String>.
    Meiner Meinung nach, sollte dem Dictionary einfach jedes mal ein Eintrag hinzugefügt werden, welche sich dann mit dem MCServePaths auslesen lassen.
    Die Exception tritt allerdings schon beim ersten "ServerData.Paths.Add(MCServePaths.FOLDER_LOGS , Assembly.GetExecutingAssembly().Location + "\\logs");" auf.
    Hier sind die Ausnahmedetails von VS2012:
    Code:
    System.TypeInitializationException wurde nicht behandelt.
      HResult=-2146233036
      Message=Der Typeninitialisierer für "MCServeCore.ServerData" hat eine Ausnahme verursacht.
      Source=MCServeCore
      TypeName=MCServeCore.ServerData
      StackTrace:
           bei MCServeCore.Init.ServerInit.Reload() in c:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\MCServeCore\Init\ServerInit.cs:Zeile 30.
           bei MCServeCore.GameServer.Initialize() in c:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\MCServeCore\GameServer.cs:Zeile 80.
           bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           bei System.Threading.ThreadHelper.ThreadStart()
      InnerException: System.Collections.Generic.KeyNotFoundException
           HResult=-2146232969
           Message=Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
           Source=mscorlib
           StackTrace:
                bei System.Collections.Generic.Dictionary`2.get_Item(TKey key)
                bei MCServeCore.Components.ServerProperties..ctor() in c:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\MCServeCore\Components\ServerProperties.cs:Zeile 59.
                bei MCServeCore.ServerData..cctor() in c:\Users\Lars\Documents\Visual Studio 2012\Projects\MCServe\MCServeCore\ServerData.cs:Zeile 33.
           InnerException:
    Aus der Zeile "Der angegebene Schlüssel war nicht im Wörterbuch angegeben." entnehme ich, dass es ein Fehler mit MCServePaths gibt, oder?
    Ich bin echt froh über jede Hilfe .
    MfG Xe77a

  • #2
    Aus der Zeile "Der angegebene Schlüssel war nicht im Wörterbuch angegeben." entnehme ich, dass es ein Fehler mit MCServePaths gibt, oder?
    Es passiert im Konstruktor von ServerProperties den du vielleicht mal zeigen solltest.

    Comment


    • #3
      Hier ist der Konstruktor :[Highlight=c#]public ServerProperties()
      {
      if (File.Exists(MCServeCore.ServerData.Paths[MCServePaths.SETTINGS]))
      {
      /*
      StreamReader ServerPropertiesFile = new StreamReader(MCServeCore.ServerData.ServerProperti esPath);
      String ServerPropertiesContent = ServerPropertiesFile.ReadToEnd();
      String[] ServerPropertiesLines = ServerPropertiesContent.Split('\n');
      foreach (String ServerPropertiesLine in ServerPropertiesLines)
      {
      if(ServerPropertiesLine[0] != '#')
      {
      String[] Property = ServerPropertiesLine.Split('=');
      String Name = Property[0];
      String Value = Property[1];
      Add(new Property(Name, Value, Types.PropertyType.OBJECT));
      }
      }
      ServerPropertiesFile.Close();
      */
      }
      else
      {
      PropertiesTsCreate = DateTime.Now;
      Add(new Property("GeneratorSettings", "", PropertyType.STRING));
      Add(new Property("EnableCommandBlock", true, PropertyType.BOOLEAN));
      Add(new Property("AllowNether", true, PropertyType.BOOLEAN));
      Add(new Property("LevelName", "world", PropertyType.STRING));
      Add(new Property("AllowFlight", true, PropertyType.BOOLEAN));
      Add(new Property("ServerPort", 25565, PropertyType.INT));
      Add(new Property("LevelType", "DEFAULT", PropertyType.STRING));
      Add(new Property("LevelSeed", "", PropertyType.STRING));
      Add(new Property("ServerIp", "", PropertyType.STRING));
      Add(new Property("MaxBuildHeight", 256, PropertyType.INT));
      Add(new Property("SpawnNpcs", true, PropertyType.BOOLEAN));
      Add(new Property("WhiteList", true, PropertyType.BOOLEAN));
      Add(new Property("SpawnAnimals", true, PropertyType.BOOLEAN));
      Add(new Property("Hardcore", false, PropertyType.BOOLEAN));
      Add(new Property("TexturePack", "", PropertyType.STRING));
      Add(new Property("OnlineMode", true, PropertyType.BOOLEAN));
      Add(new Property("Pvp", false, PropertyType.BOOLEAN));
      Add(new Property("Difficulty", 2, PropertyType.INT));
      Add(new Property("Gamemode", "CREATIVE", PropertyType.STRING));
      Add(new Property("MaxPlayers", 20, PropertyType.INT));
      Add(new Property("SpawnMonsters", true, PropertyType.BOOLEAN));
      Add(new Property("GenerateStructures", true, PropertyType.BOOLEAN));
      Add(new Property("ViewDistance", 16, PropertyType.INT));
      Add(new Property("Motd", "Minecraft Server based on MCServe", PropertyType.STRING));
      Add(new Property("SpawnProtection", 16, PropertyType.INT));
      Add(new Property("SnooperEnabled", true, PropertyType.BOOLEAN));
      Add(new Property("EnableRcon", true, PropertyType.BOOLEAN));
      Add(new Property("EnableQuery", true, PropertyType.BOOLEAN));
      Add(new Property("EnableWebUi", true, PropertyType.BOOLEAN));
      }
      }
      [/Highlight]Im Debug ist mir gerade aufgefallen, dass an dieser Stelle [Highlight=c#]if (File.Exists(MCServeCore.ServerData.Paths[MCServePaths.SETTINGS]))[/highlight] ServerData.Paths keine Werte beinhaltet.

      Comment


      • #4
        Wenn ich deinen Stack dann richtig interpretiere ist ServerData ein statische Klasse auf die du in ServerInit.Reload zum ersten mal zugreifst. Beim konstruieren der statischen Member von ServerData wird unter anderem ein ServerProperties Instanz konstruiert die wiederum auf ServerData zugreift. Der Gegenseite bezug von ServerProperties und ServerData wird das Problem sein. Da solltest du noch mal genau über die Zuständigkeiten der einzelnen Klassen nachdenken. Du könntest zwar durch genauere Steuerung der Erzeugung von ServerData, indem du dafür sorgst das Path vor ServerProperties initialisiert wird dieses eine Problem lösen, aber die Gegenseite Abhängigkeit hört sich nach einem grundsätzlichen Problem an das dir immer wieder um die Ohren fliegen wird wenn du an den Klassen weiter schraubst. Versuche eine eindeutig gerichte Abhängigkeit hinzubekommen.

        Comment


        • #5
          Originally posted by Ralf Jansen View Post
          Wenn ich deinen Stack dann richtig interpretiere ist ServerData ein statische Klasse auf die du in ServerInit.Reload zum ersten mal zugreifst. Beim konstruieren der statischen Member von ServerData wird unter anderem ein ServerProperties Instanz konstruiert die wiederum auf ServerData zugreift.
          Ja, das ist richtig. So sieht ServerData aus :[Highlight=c#]public static class ServerData
          {
          // File Paths
          public static ServerPaths Paths = new ServerPaths();
          // ServerConsole Class
          public static ServerConsole Console = new ServerConsole();
          // ServerBot Player
          public static ServerPlayer ServerPlayerBot = new ServerPlayer("ServerBot", "Server Team");
          // Player-List
          public static PlayerList PlayerList = new PlayerList();
          // Server Properties
          public static ServerProperties ServerProperties = new ServerProperties();
          // Command Executing List
          public static Dictionary<String, Delegate> CommandList = new Dictionary<String, Delegate>();
          // WhiteList
          public static ServerWhiteList WhiteList = new ServerWhiteList();
          // Banned Players
          public static ServerBannedPlayersList BannedPlayers = new ServerBannedPlayersList();
          // Banned Ips
          public static ServerIpList BannedIps = new ServerIpList();
          // Ops
          public static ServerOpsList Ops = new ServerOpsList();
          }[/Highlight] Wie man sieht wird Paths direkt an erster festgelegt, und mittlerweile in seinem Konstruktor die einzelnen Pfade festgelegt. Somit sollten alle weiteren ja auf Paths/dem Inhalt von Paths zugreifen können, oder nicht?

          Comment

          Working...
          X