Тип Пересылка в .Net: должен ли перенаправленный class наследоваться от classа Type?

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

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

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

Нет.

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

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

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

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

Ниже перечислены определения типов:

  • не общие или неконструированные общие classы, структуры, интерфейсы и delegates
  • перечислений

Ниже приведены ссылки на типы (все они относятся к другому типу, ни одно из них не определяет что-то новое).

  • построенные общие classы, структуры, интерфейсы и delegates
  • массивы
  • указатели
  • nullables

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

Из всех этих типов можно перенаправить только определения типов. objectiveю форвардера типа является указание, что «тип, который ранее был определен этой сборкой, теперь определен этой сборкой», поэтому имеет смысл перенаправить определение типа. Вы не можете перенаправить тип MyStruct[] ; это не имеет никакого смысла. Вы можете перенаправить MyStruct .

что вы подразумеваете под «неконфигурированными родовыми classами»? Означает ли это только определение общего понятия, а не общее, которое было создано с указанным типом?

Правильный.

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

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

Это немного запутанная тема, так что вот пошаговый пример – теперь, используя имена из ответа Эрика, чтобы помочь сохранить целостность. Мы собираемся начать с одной библиотеки (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. Build 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.dll.

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