2011-07-26 102 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

理解ForwardRef行爲以同樣的方式爲extern,並適用於當您使用的語言(C#中通過extern)缺乏直接支持指導的運行時間。因此,使用應該非常類似於the extern modifier,最值得注意的是使用[DllImport(...)]

5

ForwardRef的使用變爲幾乎是這樣的:

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!"); 
    } 
} 

現在的魔力醬。打開Visual Studio命令提示符下輸入:

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

這裏使用的,我們正在管理模塊連接在一起的連接鮮爲人知的功能之一。鏈接器能夠將相同形狀的類型凝膠化(它們需要具有完全相同的方法等)。 ForwardRef實際上可以讓您在其他地方提供實施。

這個例子是沒有意義的,但是如果單一的方法用不同的語言(例如IL)實現,你可以想象事情會變得更有趣。

+0

看起來很酷。感謝你的例子。 –

相關問題