2011-07-07 13 views
4

私は静的なクラスを持っています。TypeInitializationExceptionを受け取りました

static class AppDirectory 
{ 

    public static string PACSTEMP = Path.Combine(Path.GetTempPath() ,"PacsTemp");//@"C:\MyTemp"; 

    public static string ImageTempDirectory = Path.Combine(Path.GetTempPath(), "ImageRetrieveTemp");//@"C:\ImageRetrieveTemp\"; 

    static AppDirectory() 
    { 


     if (Directory.Exists(PACSTEMP)) 
      Directory.Delete(PACSTEMP); 

     if (Directory.Exists(ImageTempDirectory)) 
      Directory.Delete(ImageTempDirectory); 

     Directory.CreateDirectory(PACSTEMP); 
     Directory.CreateDirectory(ImageTempDirectory); 
    } 
} 

静的クラスであり、1つの静的コンストラクタを持ちます。 PACSTEMPとImageTempDirectory変数を使用しようとすると、型の初期化エラーが表示されます。 AppDirectoryが初期化されていないためです。

これらのクラスを初期化する方法を教えてください。または私はOOPのルールを逃したことがあります。

+1

静的なコンストラクタ(別名型初期化子)で失敗する可能性が高いコードを入れないでください。 –

答えて

3

フィールド初期化子がctorの前に起こるので、それは問題ないはずです、ありがとうございました。私はこれがパーミッションエラーのようなものだと思っています。正確に何を見るために.InnerExceptionを見てください:

try { 
    // something that uses AppDirectory, causing the error 
} catch (TypeInitializationException ex) { 
    Trace.WriteLine(ex.InnerException); 
    throw; 
} 

はまた、あなたが削除されているディレクトリが空でないため、削除が失敗している可能性があります。

2

静的コンストラクタは、実行中に何らかの例外をスローします。 the documentation of TypeInitializationExceptionから引用し

When a class initializer fails to initialize a type, a TypeInitializationException is created and passed a reference to the exception thrown by the type's class initializer. The InnerException property of TypeInitializationException holds the underlying exception.

だから、あなたはが本当には何が悪かったのかを見つけるためにあなたのTypeInitializationExceptionのInnerExceptionで見ている必要があります。

1

スタティックコンストラクタでIO関連コード(ファイル/フォルダのオープン/作成/削除)を実行する際に問題が発生する - このような操作はかなり規則的に失敗することが予想されます。

すべてのIOExceptionをキャッチし、何かを行うか、コンストラクタの代わりにスタートアップコードでこのオブジェクトを初期化してください。

アプリケーションへの共有サービスを提供するためのより良いアプローチのために依存性注入について読んでください。

-3

私は静的なコンストラクタが必要なのですが、コンストラクタを静的なメソッドに置き換え、静的なコンストラクタではなく静的なメソッドを呼び出すことができます。 理由: 静的定数は、あなたが 1.コール 2.任意のstticメンバー値 3を初期化する静的クラスのいずれかの方法は、それは文句を言わない自動車と呼ばれること等を対象

を初期化するたびにそれを呼び出されますと指定すると、クラスのメンバー/メソッドを参照するたびにと呼ばれます。したがって、10のメソッドと10の変数がある場合、すべてのメンバーを1回だけ(10 + 10)呼び出すと仮定すると、静的コンストラクターは20回呼び出されます。

代わりに静的メソッドを静的メソッドで置き換えて、そのメソッドをアプリケーションで最初に呼び出すと、ディレクトリ変数が設定されているはずです。

これが役に立ちます。そうでない場合は、静的コンストラクターを理解するためにGoogleを少ししてください。

REGエラー:try-catchブロックを配置し、例外の原因を調べることをおすすめします。

+1

私はあなたが間違っていると信じています: "非ジェネリッククラスのための静的コンストラクタは、特定のアプリケーションドメイン内で*多くても1回*実行します。" (C#言語仕様、第4版、第17.11節)。 – Heinzi

+1

非常に間違っている –

関連する問題