2016-08-13 10 views
-1

私が最初Logへの書き込み時にエラーが発生し{"Index (zero based) must be greater than or equal to zero and less than the size of the argument list."}System.TypeInitializationExceptionログオブジェクトの作成中にエラーが発生しました。私は新しいプロジェクトを作成し、ちょうど次<code>Log</code>ファイルを書きましたが、<code>unhandled exception of type 'System.TypeInitializationException' occured in My_Project.exe</code></p> <p>内部例外に遭遇していますよC#

と述べています。たとえば、次のコードを使用すると、プログラムはエラーメッセージとともにクラッシュします。

using System; 
using System.Windows.Forms; 
using My_Project.forms; 

namespace My_Project { 
    public static class Program { 
     [STAThread] 
     public static void Main() { 
      Utility.MyLog.Write("Test"); //<-- ERROR OCCURS HERE 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Window()); 
     } 
    } 
} 

ログインがインスタンス化されているのはここ。ここ

public static class Utility 
{ 
    // DEFAULT LOG OUTPUT. 
    public static Log MyLog = new Log(); 

    ... 
} 

..だ

using System; 
using System.IO; 
using System.Reflection; 
using My_Project.Properties; 

// STATIC USING MEMBERS 
using static My_Project.LogFormat; 
using static System.IO.File; 
using static My_Project.Utility; 

namespace My_Project { 
    public enum LogFormat { None, Message, Evaluate, Process, Result } 

    public sealed class Log { 
     // USED TO LOCK THE OUTPUT THREAD WHEN WRITING TO A FILE. 
     private readonly object _lock = new object(); 

     // DEFAULT VARIABLES 
     public readonly string FileName; 
     public readonly string FilePath; 

     // DEFAULT CONSTRUCTOR 
     public Log(string fileName = null, string filePath = null) { 
      FileName = fileName ?? Resources.DefaultLogFileName; 

      var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; 
      if (directoryInfo != null) 
       filePath = Path.Combine(filePath ?? directoryInfo.FullName, Resources.DefaultLogFilePath, FileName); 
      FilePath = filePath; 

      var projectName = Assembly.GetCallingAssembly().GetName().Name.ToUpper(); 
      Write("Hello World!"); 
     } 

     // WRITES TO A TXT FILE, AND AUTO-CREATES A FILE IF IT DOESN'T EXIST. 
     public void Write(string message) { 
      lock (_lock) { 
       try { 
        AppendAllText(FilePath, message); 
       } catch (DirectoryNotFoundException ex) { 
        Console.WriteLine(string.Format(Resources.Error_CannotFindLogFile), ex.Message); 
        throw; 
       } 
      } 
     } 

     // OPENS THE LOG FILE IN NOTEPAD. 
     public void Open() => OpenProgram(FilePath); 

     // CLEARS ALL CONTENTS FROM LOG.TXT. 
     public void Clear() => WriteAllText(FilePath, string.Empty); 
    } 
} 

は私が間違って何をやっている...それで、これまで全体ですが、私のLog.csファイルのですか?

+0

これは、静的メンバー(メソッド/コンストラクターを呼び出すstatic prop/field宣言、または静的コンストラクターのいずれか)の初期化コードにエラーがあるために発生します。あなたのケースでは、 'ユーティリティ'型は構築することができません。これを行うには、新しい 'Log'をうまく構築する必要があるからです。コード内で 'Utility'クラスが初めて参照されるときには、型初期化子が実行されます(' public static Log MyLog = new Log(); ')' new Log() 'が投げているようです。デバッガを使用します。問題の発生場所を確認します。 – spender

答えて

0

私のリソースファイルでは、無効なファイルパスエラーが発生していました。私は読み込み中のフォルダ名が間違っていました。

0

ないあなたのコードをデバッグすることができないため、例外が発生していますが、Log()を初期化例外原因はどこか、コンストラクタ内またはあなたがWrite("Hello World!");を呼び出している内側のコンストラクタ以来Write()方法のいずれかで失敗してきているラインを正確にすることを確認。特に以下の行。 Logクラスのコンストラクタにブレークポイントを置き、それをステップ実行して、どこが失敗しているかを確認する必要があります。理由はすでにあります(内部例外メッセージIndex (zero based) must be greater than or equalを参照)。

public static Log MyLog = new Log(); 
+0

エラーは、上記のようにプロジェクトのMain()関数で発生しており、 'Utility.MyLog.Write(" Test "); // < - ERROR OCCURS HERE'が呼び出されます。この行は完全にクラッシュし、Log.csクラスに実際には流れません。 – TheAuzzieJesus

+1

@TheAuzzieJesus、いいえ、流れません。答えを正しく読んで、ブレークポイントを入れてコードをデバッグし、どこが失敗したのかを正確に見てください。それは今のところ言うことができます。 – Rahul

+0

それは私が言っていることです。オブジェクトの呼び出しでクラッシュし、 'Log.cs'クラスへのデバッグを許可しません。私はコード全体をデバッグしようとしていました。 – TheAuzzieJesus

0

私はそれがstring.Format(Resources.Error_CannotFindLogFile)を持っているラインだと思うだろう。 WriteLineはあなたのためにフォーマットを行うので、フォーマットは不要です。

+0

Nahは、変更後も同じエラーが表示されます。 – TheAuzzieJesus

関連する問題