2009-03-04 1 views
4

Reflectorを使用していると、多くの場合、安全でないコードがたくさんあります。 .NETのどれが管理されていない/安全であるかは誰でも知っていますか?.NETのどれが管理されていないのですか?

+0

.NETのどの部分を正確に話していますか?安全でないコードを指定しない限り、コードは安全ではありません。 –

+0

これはどのように答えることができますか?あなたはコードや何かの行で測定したいですか? –

+0

リスト、配列クラスを見るのと同じくらいの部分です。 –

答えて

0

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

6

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

私のブログには、ロックの詳細な説明(ロータのソースを表示)がthis postにあります。

具体的に質問に答えるには、.NETソースコードをすべて取得する必要があります(たとえば、「InternalCall」または「DllImport」と言う行にはNetMassDownloaderとgrepを使用してください)、すべての行の数と比較してください。おそらく、これらの「管理されていない」行に何らかの要因を掛けて推測するか、実際の数値を得るためにRotorやWindowsのソースコードに飛び込まなければならないかもしれません。これを遠くにすると事態が曖昧になります(たとえば、File.OpenがWin32のCreateFileを呼び出すと、CreateFileを.NETに数える必要がありますか?)だから、せいぜい、 "InternalCall"に何らかの要因を乗じて推測するだけです。

+0

NetMDはかなり面白いです。 –

1

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

System.IO.FileStreamクラス(アンマネージコードも呼び出す)を使用する場合は、終了時にDisposeを呼び出して、ファイナライザが実行される代わりにファイルが閉じられることを保証してください。

+0

オブジェクトにIDisposableを実装する理由があります。問題は見えないかもしれませんが、オブジェクトを処分していない場合はおそらくメモリリークがありますが、 –

6

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

実際の管理されていないコード、たとえばPInvokeまたはCOMはバイナリにコードを持っていますが、それは重要ではありません。これは、ネイティブ関数を呼び出すために必要な最小限のスタブを表します。これは、管理されたDLLでネイティブコードがどの程度エクササイズされているかを実際に測定できないことを意味します。あなたが行うことができるのは、管理されていないコードがどれだけ実行されているかの実際の尺度を提供しない呼び出しの数を測定することです。

関連する問題