1. ホーム
  2. .net

DllImport("QCall")」とは何ですか?

2023-09-19 19:32:44

質問

.Netライブラリの多くのメソッドは、ネイティブコードで実装されています。フレームワーク自体に由来するものには [MethodImpl(MethodImplOptions.InternalCall)] . アンマネージド DLL に由来するものには [DllImport] (例えば [DllImport("kernel32.dll")] ). 今のところ異常はありません。

しかし、書き込み中に を書きながら、別の質問に対する回答 でマークされた多くのメソッドがあることを発見しました。 [DllImport("QCall")] . これらは、.Net の内部実装のようです (例. GC._Collect() ).

私の疑問は、具体的にどのような [DllImport("QCall")] は何を意味するのでしょうか?の違いは何ですか? [DllImport("QCall")][MethodImpl(MethodImplOptions.InternalCall)] ?

どのように解決するのですか?

これは古いスレッドです。CoreCLRは現在GitHubでオープンソース化されているので、もし誰かがまだ答えを探しているのなら、ここで 公式ドキュメント :

<ブロッククオート

マネージドコードからネイティブコードへの呼び出し

マネージド コードから CLR に呼び出すための 2 つのテクニックがあります。FCall は、CLR コードに直接呼び出すことができ、オブジェクト操作の面で多くの柔軟性を提供しますが、オブジェクト参照を正しく追跡しないために GC ホールを引き起こしやすくなります。QCallは、P/Invokeを介してCLRに呼び出すことができ、FCallよりも誤って使用することがはるかに困難である。FCallは、マネージドコードでは、MethodImplOptions.InternalCallビットが設定されたexternメソッドとして識別されます。QCallは、通常のP/Invokeのように見える静的なexternメソッドですが、"QCall"と呼ばれるライブラリに対するものです。

JITヘルパーを実装するためのHCall(ヘルパーコール)と呼ばれるFCallの小さなバリエーションがあり、多次元配列要素へのアクセスや範囲チェックなどを行うためのものです。HCall と FCall の唯一の違いは、HCall メソッドは例外スタックトレースに表示されないということです。

そして、小見出しで続きます。

を例示しています。