2011-07-26 7 views
5

の一例を示すことができるそれはMSDNにクールに見える:は誰もが私にMethodImplOptions.ForwardRef

は、メソッドが宣言されていることを指定しますが、その実装は、他の場所で提供さ です。

だから私は、コンソールアプリケーションでそれを試してみました:

public class Program 
{ 
    [MethodImplAttribute(MethodImplOptions.ForwardRef)] 
    public static extern void Invoke(); 

    static void Main(string[] args) 
    { 
     Invoke(); 
     Console.Read(); 
    } 
} 

は、その後、私は今、何をすべきでしょうか? Program.Invokeの実装はどこで提供できますか?マイ理解

答えて

0

ForwardRefexternと同じように働き、が、使用している言語は(C#でextern経由で)直接サポートしていないとき、ランタイムを案内するために意図されていることです。したがって、用途はthe extern modifierと非常によく似ています。特に、[DllImport(...)]を使用してください。

consumer.cs今

using System; 
using System.Runtime.CompilerServices; 

class Foo 
{ 
    [MethodImplAttribute(MethodImplOptions.ForwardRef)] 
    static extern void Frob(); 

    static void Main() 
    { 
     Frob(); 
    } 
} 

provider.cs

using System; 
using System.Runtime.CompilerServices; 

class Foo 
{ 
    // Need to declare extern constructor because C# would inject one and break things. 
    [MethodImplAttribute(MethodImplOptions.ForwardRef)] 
    public extern Foo(); 

    [MethodImplAttribute(MethodImplOptions.ForwardRef)] 
    static extern void Main(); 

    static void Frob() 
    { 
     Console.WriteLine("Hello!"); 
    } 
} 

魔法のタレ:

5

ForwardRefの利用はかなりこのように書きます。 Visual Studioのコマンドプロンプトと種類を開きます。

csc /target:module provider.cs 
csc /target:module consumer.cs 
link provider.netmodule consumer.netmodule /entry:Foo.Main /subsystem:console /ltcg 

これは、我々が管理モジュールを一緒にリンクしているリンカーのあまり知られていない機能の1つを使用します。リンカーは、同じ形状のタイプを一緒にゲル化することができます(まったく同じメソッドなどが必要です)。 ForwardRefは実際にあなたが他の場所で実装を提供できるようにするものです。

この例は、一種の無意味ですが、あなたは、単一の方法が異なる言語(例えばIL)で実装されている場合は、物事をより面白くなって想像することができます。

+0

見た目がクールです。あなたの例をありがとう。 –

関連する問題