12

MSDN上看起来很酷:

指定方法已声明,但其实现在别处提供。

所以我在控制台应用程序中尝试了它:

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

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

那我现在该怎么办?我在哪里可以提供实施Program.Invoke

4

2 回答 2

15

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)实现一个方法,事情会变得更有趣。

于 2015-11-30T23:37:04.513 回答
1

我的理解是,它ForwardRef的行为方式与 , 相同extern,旨在在您使用的语言缺乏直接支持(通过externC# 中)时指导运行时。因此,用法应该与修饰符非常相似extern尤其是使用[DllImport(...)].

于 2011-07-26T07:13:55.863 回答