2016-06-24 8 views
6

は私が再度読んでいた私はextern keywords documentationの特許請求の範囲の第1の部分があることに気づいたときに、今日いくつかの.NETドキュメントを通じて:[DllImport]属性を使用せずにexternキーワードを使用するのが適切なのはいつですか?

にextern修飾子が外部に実装されているメソッドを宣言するために使用されます。 一般的な使用 extern修飾子のは、Interopサービスを使用してアンマネージコードを呼び出すときにDllImport属性を使用します。

この文書では、「一般的な使用」のexternは、DllImport属性で使用されていると述べています。これは、DllImportが必要ない他のユースケースがあることを意味します。私は多くの外部の管理されていないライブラリを自分のアプリケーションに統合する必要はありませんでしたが、すべての場合、リンクされたメソッドはDllImportで定義されていました。

私はGoogleとMSDNを通じて複数のクエリを検索しましたが、externキーワードを使用して、管理されていないDLLからメソッドを外部メソッドインポートとして定義することはできません。

externキーワードをメソッド定義の[DllImport(...)]属性を定義することなく、どのように使用しますか?

エイリアスを定義するときには、externを使用することに固有のものではありません。これはキーワードの別の使用であり、そのケースはoutlined in a different articleで、MSDN C#言語リファレンス内にあります。

+0

http://stackoverflow.com/questions/2347260/when-must-we-use-extern-alias-keyword-in-c これはあなたに関連するようです – cvraman

+0

@cvraman私の最後の文章を参照してください質問。 – RLH

+1

あなた自身のジャストインタイムコンパイラを書かない限り、決して。実際の呼び出しに対して「どこか別の場所で定義されたものを呼び出す」方法を知る必要があるのはジッタです。あなたが毎日使っているものは、特定のケースだけを知っています。[DllImport]もそれらの1つです。 CLRとCOMメソッド呼び出しで定義された関数への内部呼び出しは、他の呼び出しです。それは拡張可能ではありません。 –

答えて

8

私が使用する場合は、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節に記載されています(現在はDllImportInternalCallが利用可能です)。

C#コンパイラを使用すると、どこ実装の生活を示すために、任意の属性を使用externような方法をマークしていないすることができますが、そのような方法でどのようなタイプは、実行時にTypeLoadExceptionになります。

関連する問題