2011-07-26 12 views
5

Se ve bien en MSDN:¿Alguien puede mostrar un ejemplo de MethodImplOptions.ForwardRef

Especifica que se declara el método, pero su implementación es proporcionado en otro lugar.

Así que he probado en una aplicación de consola:

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

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

Entonces, ¿qué debería hacer ahora? ¿Dónde puedo proporcionar la implementación de Program.Invoke?

Respuesta

0

Mi comprensión ForwardRef es que actúa de la misma manera que extern, y ha sido diseñada para guiar el tiempo de ejecución cuando el idioma que está utilizando carece de apoyo directo (a través de extern en C#). Como tal, el uso debería ser muy similar al the extern modifier, más notablemente usando [DllImport(...)].

5

El uso de ForwardRef va más o menos así:

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

Ahora la salsa mágica. Abra un símbolo del sistema de Visual Studio y el tipo:

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

Este utiliza una de las funciones menos conocidas del enlazador en el que estamos vinculando módulos administrados juntos. El enlazador es capaz de unir los mismos tipos de gel (necesitan tener los mismos métodos, etc.). ForwardRef es lo que realmente te permite implementar en otro lugar.

Este ejemplo no tiene sentido, pero puede imaginar cosas cada vez más interesantes si se implementa un único método en un idioma diferente (por ejemplo, IL).

+0

Parece genial. Gracias por tu ejemplo. –

Cuestiones relacionadas