2011-12-20 21 views
2

混合.NETアセンブリ(つまり、管理されていないマネージ/アンマネージのC++アセンブリを意味する)のCLRとCRTの初期化の順序についていくつか質問があります。混合管理/非管理アセンブリのロード順序

私は、混在モードのアセンブリdllファイルを持っており、Assembly.Load経由でロードされます。私は、静的なネイティブオブジェクトは、いくつかのマネージコードが最初に呼び出されるまで、初期化または呼び出されないことに気付きます。 OK。だから私は、起動時にCLRコードが最初に初期化され、CRTの初期化が最後に呼び出されるようにします。シャットダウンの順序はどうですか? CRTのシャットダウンが先に行われ、CLRのシャットダウンは最後に行われますか?

これはどのように行くのですか?

start of program lifetime 

initilialize CLR 
...initilialize CRT 
...construct native static instances 

... program runs.... 

...shutdown CLR 
...destruct native static instances 
shutdown CLR 

end of program lifetime 

他の順番ですか?

私の質問は、実行可能ファイル(つまり.exe)である混合モードアセンブリにも当てはまります。それは似ていますか?

start of program lifetime 

initilialize CLR 
...initilialize CRT 
...construct native static instances 

... program runs.... 

...shutdown CLR 
...destruct native static instances 
shutdown CLR 

end of program lifetime 
+1

Assembly.Load()を使用すると、かなり前にCLRが初期化されていることがわかります。 CRTは、「module initializers」と呼ばれる曖昧なCLI機能によって初期化されます。クラス初期化子に似ていますが、アセンブリがロードされると自動的に実行されます。 AppDomain :: DomainUnloadおよびProcessExitのイベントハンドラによって、CLRが終了する前に初期化されなくなります。たぶんあなたはこの質問をする理由に焦点を当てるべきです。 –

+0

Reedとの私のコメントを部分的に説明しています。 –

答えて

2

これはMSDNのInitialization of Mixed Mode Assembliesページに記載されています。

これは実際にあなたのアイデアの反対です。ネイティブコードがの最初のに初期化され、その後マネージコードが取得されます。 DllMainの内部の管理コードにはアクセスできません。

破棄処理の順序はMSDNで明示的に文書化されておらず、C++/CLI仕様書に明示的に記載されていないようです。これは実装固有のものであり、付録のネイティブライブラリと管理ライブラリの相互作用に関する「非公開の振る舞い」の項で扱われています。

+0

リンクありがとうございます。私の問題は、私たちのアプリケーションがシャットダウンするとき、私たちはネイティブの静的なオブジェクトが爆発してアプリケーションをクラッシュさせることです。 –

+0

@CJohnson私はそれらを直接修正しようとしています。シャットダウン時にアプリをクラッシュさせる理由はありません... –

+0

これは問題です...時にはクラッシュし、時にはクラッシュすることもありません。実際には一文で記述するのは難しいです。しかし、私はウィンメインが出た後ずっと起きているように、衝突時にコールスタックを示す素晴らしいミニダンプ(フィールドから)を持っています。 –

関連する問題