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 の使用法は、次のようになります。

consumer.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

これは、マネージ モジュールをリンクするリンカのあまり知られていない機能の 1 つを使用します。リンカーは、同じ形状のタイプを一緒にゲル化できます (まったく同じメソッドを持つ必要があるなど)。ForwardRef は、実際に他の場所で実装を提供できるようにするものです。

この例はちょっと無意味ですが、1 つのメソッドが別の言語 (IL など) で実装されると、さらに興味深いことが想像できます。

于 2015-11-30T23:37:04.513 に答える
1

私の理解では、ForwardRefは と同じように動作し、使用している言語が ( C# で)extern直接サポートされていない場合にランタイムをガイドすることを目的としています。そのため、使用法は修飾子externと非常に似ている必要があり、最も顕著なのは を使用することです。extern[DllImport(...)]

于 2011-07-26T07:13:55.863 に答える