Использование 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).