6


8

私は最近、ライブラリがデバッグビルドではなくリリースビルドとしてビルドされたときにのみ現れるバグを抱えています。 図書館は .NET dll with a COM wrapper and I am using CoCreateInstance to create a アンマネージCアプリのdllからのクラス。 私がついにバグを突き止めたとき、それはシングルトンオブジェクトにアクセスすることによって引き起こされました。 シングルトンインスタンスを次のように宣言しました。

プライベート静的読み取り専用MyObjectType s_instance = new MyObjectType;

それからそれにアクセスしました:

public static MyObjectTypeインスタンス{get {return s_instance;}} }}

これは失敗しました。 それをに変更します。

プライベートstatic MyObjectType s_instance。

public static MyObjectType Instance {get {if(s_instance == null){s_instance = new MyObjectType();} s_instanceを返します。 }}

問題を修正しました。 最初の使用方法がうまくいかなかった理由や、それをどちらかの方法で実行することにマイナス面がある場合はどうでしょうか。

release dllは他のマネージドアプリから完全に使えるようです。

2 Answer


8


空の静的コンストラクタを追加するか、静的コンストラクタでシングルトンを初期化してください。

Jon Skeetはシングルトンパターン ここの完全な議論をしています。 失敗した理由はわかりませんが、「beforefieldinit」フラグに関連している可能性があります。 彼の4番目の例を見てください。彼はこのフラグを調整するために静的コンストラクタを追加しています。 私はbeforefieldinitの専門家であるとは主張していませんが、この症状は ここで議論されている症状のいくつかにあてはまるようです。


0


Marc Gravellが言ったことを繰り返しますが、beforefieldinitの問題のように思えます。つまり、空の静的コンストラクタがあなたの解決策であることを意味します。 確実な答えを得るためには、クラス内のすべてのコンストラクターを投稿する必要があります。

2番目の方法には、遅延ロードという利点があります(これが利点です)。