74

リフレクターを深く調べるとextern、ソースのないメソッドに出くわします。http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspxで msdn のドキュメントを読みました。その記事から得たのは、extern修飾子を含むメソッドを注入する必要があるということです。これは、抽象的なファクトリ パターンのように機能することを意味すると解釈しました。非静的な extern メソッドを見たことがないことにも気付きました。静的宣言は要件ですか (これがどのように理にかなっているのかわかりました)? ここではまだ推測中であり、実際にどのように機能するかはわかりません。MethodImplAttributeコンパイラは処理を軽減する特定の属性を認識しなければならないように思えますが、私が遭遇したもの以外の属性が何であるかはわかりません。DllImportAttributeMSDNの例から。extern誰かが属性をどのように活用していますか? 多くの場合、これによりパフォーマンスが向上すると述べています。externまた、次のようなメソッドのソースを調べるにはどうすればよいObject.InternalGetEquals()ですか?

4

4 に答える 4

117

多くの質問に答える C# 仕様のセクション 10.6.7 を読むことを検討してください。便宜上、ここにその一部を転載します。


メソッド宣言に extern 修飾子が含まれている場合、そのメソッドは外部メソッドと呼ばれます。外部メソッドは外部で実装され、通常は C# 以外の言語を使用します。外部メソッド宣言は実際の実装を提供しないため、外部メソッドのメソッド本体は単にセミコロンで構成されます。外部メソッドはジェネリックでない場合があります。通常、extern 修飾子は DllImport 属性と組み合わせて使用​​され、外部メソッドを DLL (ダイナミック リンク ライブラリ) で実装できるようにします。実行環境は、外部メソッドの実装を提供できる他のメカニズムをサポートする場合があります。外部メソッドに DllImport 属性が含まれている場合、メソッド宣言には static 修飾子も含まれている必要があります。


誰かが extern 属性をどのように活用していますか?

  • 選択したアンマネージ言語でコードを記述します。
  • それを DLL にコンパイルし、コードのエントリ ポイントをエクスポートします。
  • 指定された DLL でメソッドを extern メソッドとして定義する相互運用ライブラリを作成します。
  • C# から呼び出します。
  • 利益!

Object.InternalGetEquals() のような extern メソッドのソースを調べるにはどうすればよいですか?

https://github.com/dotnet/coreclr/tree/master/src/vmに移動します

于 2011-02-24T21:42:01.447 に答える
35

属性でマークされたメソッドextern[DllImport]通常、C ライブラリへの呼び出しです。この機能は、WinAPI またはレガシー コードを呼び出す場合に便利です。

これは MSDN の例です。

using System;
using System.Runtime.InteropServices;
class MainClass 
{
   [DllImport("User32.dll")]
   public static extern int MessageBox(int h, string m, string c, int type);

   static int Main() 
   {
      string myString; 
      Console.Write("Enter your message: ");
      myString = Console.ReadLine();
      return MessageBox(0, myString, "My Message Box", 0);
   }
}

MessageBoxWindowsuser32.dllライブラリ内で定義されているものを呼び出します。ここではランタイムがすべての面倒な作業を行いますが、メモリを手動で管理する必要がある場合もあります。署名が間違っていると、プログラムが呼び出しで失敗したり、リークが発生したり、メソッドがまったく異なるものを返したりする可能性があるため、注意してください! pinvoke.netは、さまざまな API の署名を修正するための優れたツールだと思います。

extern属性を持たないが[DllImport]属性で装飾されている .NET Framework 内の一部のメソッド[MethodImpl (MethodImplOptions.InternalCall)]は、通常、C で記述されている CLR 自体に実装されているものです。そのようなメソッドの中には、ランタイム自体を管理するために C# で実装できないものもあれば、パフォーマンスが重要で C の方が高速であるため C で実装されているものもあります。

これは、MSDNがそれらについて述べていることです。

内部呼び出しを指定します。内部呼び出しは、共通言語ランタイム自体に実装されているメソッドへの呼び出しです。

実際の実装コードを見ると、Microsoft から入手できるとは思えませんが、CLR のクールな代替実装がいくつかあるので、ぜひチェックしてみてください。

于 2011-02-24T21:39:03.277 に答える
3

externアンマネージ コードへのマネージド アセンブリの呼び出しを容易にするためのプラットフォーム呼び出し (pinvoke) を使用します。このexternキーワードは、正しいデータ マーシャリングを可能にするために正しいコードを生成する必要があることをコンパイラに通知します。

于 2011-02-24T21:36:05.477 に答える