Переадресация типов в .Net: должен ли перенаправленный класс наследоваться от класса Type? - PullRequest
2 голосов
/ 08 января 2011

Если вы хотите переслать ссылку на класс в другую сборку с помощью перенаправления типов, нужно ли этот класс наследовать от типа?

Полагаю, что я на самом деле ищу - что это означает или что обозначено словом "Тип" во фразе и понятии "Пересылка типов".

Ответы [ 2 ]

12 голосов
/ 08 января 2011

Если вы хотите переслать ссылку на класс в другую сборку с помощью перенаправления типов, нужно ли этому классу наследовать от типа?

Нет.

Я предполагаю, что я на самом деле ищу, что ... Что это означает или что обозначено словом "Тип" во фразе и концепции перенаправления типов.

Предположим, у вас есть тип Foo всборки Alpha, и в вашей следующей версии вы понимаете, что Foo действительно должен был быть в сборке Bravo.Вы не можете переместить тип, потому что все ваши клиенты, которые зависят от Foo в Alpha, будут нарушены.

Решение состоит в том, чтобы переместить тип Foo в Bravo, а затем отправить новую версию Alpha, содержащую средство пересылки типов, которое сообщает пользователям Alpha «если вы ищете Foo, он теперь найден в Bravo»,Таким образом, вы не сломите никого, кто зависит от того, что было так, как было раньше.

Я думаю, что мне здесь не хватает, каково определение «Типа» в понятииТип Переадресация.Что квалифицируется как тип?

Следующие вещи являются типом определения :

  • неуниверсальные или неструктурированные универсальные классы, структуры, интерфейсы и делегаты
  • перечисления

Следующие элементы относятся к типу ссылки (все они относятся к другому типу; ни один из этих определить что-то новое.)

  • сконструированные общие классы, структуры, интерфейсы и делегаты
  • массивы
  • указатели
  • обнуляемые значения

(И есть один тип, который не попадает ни в одну из категорий, который является возвращаемым типом «void».)

Из всех этих типов могут быть пересланы только определения типов.Назначение перенаправителя типов состоит в том, чтобы сказать, что «тип, который раньше определялся этой сборкой, теперь определяется этой сборкой», поэтому имеет смысл только перенаправить тип definition .Вы не можете переслать тип MyStruct<int>[];это не имеет никакого смысла.Вы можете переслать MyStruct<T>.

что вы подразумеваете под "неструктурированными универсальными классами? Это означает только определение универсального шаблона, а не универсальный, который был создан с указанным типом?

Исправить.

А можете ли вы указать мне, где вы нашли информацию для "ссылок на типы" и "определений типов"?

Этине являются понятиями из спецификации языка C #, а являются понятиями из базовой системы типов инфраструктуры общего языка.Для подробного технического взгляда на то, как CLI отличается между определенными и ссылочными типами, прочтите спецификацию CLI ECMA 335, в частности, ищитеразделы таблиц метаданных для TypeDef и TypeRef.

6 голосов
/ 08 января 2011

Это немного запутанная тема, так что вот пошаговый пример - теперь используйте имена из ответа Эрика, чтобы помочь сохранить согласованность. Мы собираемся начать с одной библиотеки (Alpha.dll) и создать приложение (Test.exe), которое зависит от Alpha. Затем мы перейдем к типу, от которого зависит Test.exe (Foo), в другую библиотеку (Bravo.dll) без перекомпиляции Test.exe.

  1. Создайте следующие файлы:

    Foo.cs

    using System;
    
    public class Foo
    {
        public static void Report()
        {
            Console.WriteLine("Foo.Report");
        }
    }
    

    Test.cs

    class Test
    {
        static void Main()
        {
            Foo.Report();
        }
    }
    
  2. Сборка Alpha.dll:

    csc /target:library /out:Alpha.dll Foo.cs
    
  3. Build Test.exe

    csc /r:Alpha.dll Test.cs
    
  4. Запустите Test.exe - вы должны получить очевидный вывод

  5. Build Bravo.dll:

    csc /target:library /out:Bravo.dll Foo.cs
    
  6. Создать новый файл, Forwarding.cs :

    using System.Runtime.CompilerServices;
    [assembly:TypeForwardedTo(typeof(Foo))]
    
  7. Перекомпилируйте Alpha.dll:

    csc /r:Bravo.dll /target:library /out:Alpha.dll Forwarding.cs
    

    Обратите внимание, что мы не , включая код Foo в Alpha.

  8. Запустите Test.exe - он все равно будет работать, несмотря на то, что Test.exe запрашивает ссылку на Foo в Alpha.dll ... CLR просто перенаправляет его в Bravo. длл.

    Если вы посмотрите в Test.exe, он все равно будет ссылаться на Alpha. Если вы заглянете в Alpha.dll, то обнаружите, что код для типа Foo больше не существует ... только через переадресацию типов все вместе.

...