Может кто-нибудь показать мне пример MethodImplOptions.ForwardRef - PullRequest
11 голосов
/ 26 июля 2011

Выглядит круто на MSDN :

Указывает, что метод объявлен, но его реализация предоставляется в другом месте.

Итак, я попробовал это в консольном приложении:

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

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

Тогда что мне теперь делать? Где я могу предоставить реализацию Program.Invoke?

Ответы [ 2 ]

13 голосов
/ 01 декабря 2015

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

1 голос
/ 26 июля 2011

My понимание заключается в том, что ForwardRef действует так же, как extern, и предназначено для управления средой выполнения, когда используемый вами язык не имеет прямой поддержки (через extern в C #) , Таким образом, использование должно быть очень похоже на модификатор extern , наиболее заметно использование [DllImport(...)].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...