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).
Parece genial. Gracias por tu ejemplo. –