2

混合 .NET アセンブリ (つまり、マネージド/アンマネージド C++ アセンブリが混在していることを意味します) の CLR および CRT の初期化の順序についていくつか質問があります。

したがって、混合モードのアセンブリ dll ファイルがあり、Assembly.Load を介して読み込まれるとします。マネージド コードが最初に呼び出されるまで、静的ネイティブ オブジェクトは初期化または呼び出されないことに気付きました。わかった。したがって、起動時に 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
4

1 に答える 1

2

これについては、混合モード アセンブリの初期化に関するMSDN ページ で説明されています。

それは実際にはあなたの考えの反対です。ネイティブ コードが最初に初期化され、次にマネージ コードが初期化されます。内のマネージ コードへのアクセスは許可されていませんDllMain

破棄プロセスの順序は、MSDN に明示的に文書化されておらず、C++/CLI 仕様にも明示的に文書化されていないようです。これは実装固有のものであり、付録のネイティブ ライブラリとマネージド ライブラリ間の相互作用に関連する「文書化されていない動作」セクションで説明されていると思います。

于 2011-12-20T17:58:30.297 に答える