4

Reflector を使用していると、多くの安全でないコードに遭遇することがよくあります。管理されていない/安全な.NETの割合を知っている人はいますか?

4

4 に答える 4

6

これは答えるのが本当に難しい質問です。アンセーフ コードは、バイナリで存在し、IL 命令の観点から測定できるという意味で、定量化が容易です。

PInvoke や COM などの実際のアンマネージ コードは、バイナリにコードを持っていますが、重要ではありません。これは、ネイティブ関数を呼び出すために必要な最小限のスタブのみを表します。つまり、マネージ DLL で実行されているネイティブ コードの量を実際に測定することはできません。できることは呼び出しの数を測定することだけです。これでは、アンマネージ コードが実行されている量を実際に測定することはできません。

于 2009-03-04T21:34:55.053 に答える
6

Win32 API を呼び出すだけの PInvoke のインスタンスが多数あります。ただし、CLR 自体に実装されている機能もあります (インターロック操作など)。これがどのように行われるかを見たい場合は、Rotorを見てください。

私のブログのこの記事では、ロック (Rotor ソースの表示) について詳しく説明しています。

あなたの質問に具体的に答えるには、すべての .NET ソース コードを取得し (たとえば、"InternalCall" または "DllImport" という行にはNetMassDownloaderと grep を使用)、それをすべての行の数と比較する必要があります。おそらく、これらの「管理されていない」行のそれぞれに何らかの係数を掛けて推測するか、Rotor または Windows のソース コードを調べて実際の数値を取得する必要があります。ここまで行くと、物事があいまいになります (たとえば、File.Open が Win32 の CreateFile を呼び出した場合、CreateFile は .NET にカウントされますか?私はそうは思いません)。したがって、せいぜい「InternalCall」に推測する係数を掛けるだけです。

于 2009-03-04T21:32:11.800 に答える
1

System.Windows.Forms 呼び出しの多くはアンマネージ ウィンドウ API を呼び出しますが、この名前空間で作成したオブジェクトを手動で破棄する必要があるとは思いませんでした。

System.IO.FileStream クラスを使用する (アンマネージ コードも呼び出す) 場合は、終了時に必ず Dispose を呼び出して、ファイナライザーの実行時ではなく、その場でファイルが閉じられることを保証できるようにします。

于 2009-03-04T21:33:59.083 に答える
0

安全でない呼び出しは対応する .NET オブジェクトによってラップされるため、実際には問題になりません。考慮する必要があるのは、リソースの割り当てと、IDisposable を実装するオブジェクトの破棄です。

于 2009-03-04T21:30:50.243 に答える