ForwardRef 的用法大致如下:
消费者.cs
using System;
using System.Runtime.CompilerServices;
class Foo
{
[MethodImplAttribute(MethodImplOptions.ForwardRef)]
static extern void Frob();
static void Main()
{
Frob();
}
}
提供者.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)实现一个方法,事情会变得更有趣。