私が使用する場合は、Microsoft開発者であれば、CLR自体で定義されたメソッドを呼び出すことです。 GC._WaitForFullGCApproach
のように:
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern int _WaitForFullGCApproach(int millisecondsTimeout);
注:なしDllImport
。もちろん、これはちょっと騙されています - これは、管理されていないメソッドへの呼び出しです。ちょうどDLLへの明示的な参照ではありません。しかし、それはmscorlib
アセンブリでのみ有効であるため、単なる死体はそのようなコードを呼び出すことはできません。
InternalCall
の別の用途は、COM相互運用のために生成されたタイプである:
namespace Microsoft.Office.Interop.Excel {
[DefaultMember("_Default")]
[ClassInterface(0)]
[ComSourceInterfaces("Microsoft.Office.Interop.Excel.AppEvents\0")]
[Guid("00024500-0000-0000-C000-000000000046")]
[TypeLibType(2)]
[ComImport]
public class ApplicationClass {
// ...
[DispId(302)]
[MethodImpl(MethodImplOptions.InternalCall)]
public virtual extern void Quit();
// ...
}
}
属性はランタイムがCOMインターフェイスへの呼び出しとして、メソッド呼び出しを解決することができます。 InternalCall
のこの使用は、mscorlib
の外で有効なであることは明らかです。あなたは通常、C#でこのようなコードを書くことはありません。これは、COMタイプライブラリを参照として追加するとオンデマンドで生成されます。
C#言語仕様は、MSDNよりも若干詳細に入る:
extern
改質剤は、典型的には、外部の方法により実施することができるように、DllImport
属性(§17.5.1)と組み合わせて使用されています DLL(ダイナミックリンクライブラリ)。実行環境は、 の他のメカニズムをサポートすることができ、それによって外部メソッドの実装は とすることができる。のみない実装を持たないとしてマーキング、0にメソッドのRVA(相対仮想アドレス)を設定する効果を有するextern
方法マーキング実装の観点から
、。実行時にメソッドの実際の実装を見つける方法を記述するためには、DllImport
(およびMethodImpl
)のような属性が必要です。これは、ECMA-335の「IFCの実装方法メタデータ」の第I.9.4節に記載されています(現在はDllImport
とInternalCall
が利用可能です)。
C#コンパイラを使用すると、どこ実装の生活を示すために、任意の属性を使用extern
とような方法をマークしていないすることができますが、そのような方法でどのようなタイプは、実行時にTypeLoadException
になります。
http://stackoverflow.com/questions/2347260/when-must-we-use-extern-alias-keyword-in-c これはあなたに関連するようです – cvraman
@cvraman私の最後の文章を参照してください質問。 – RLH
あなた自身のジャストインタイムコンパイラを書かない限り、決して。実際の呼び出しに対して「どこか別の場所で定義されたものを呼び出す」方法を知る必要があるのはジッタです。あなたが毎日使っているものは、特定のケースだけを知っています。[DllImport]もそれらの1つです。 CLRとCOMメソッド呼び出しで定義された関数への内部呼び出しは、他の呼び出しです。それは拡張可能ではありません。 –