Как Microsoft создавала блоки, которые имеют циклические ссылки?

Используйте hashcash.

Hashcash является инструментом меры по счетчику отказа в обслуживании. Его основное текущее использование должно помочь hashcash пользователям постараться не терять электронную почту из-за на основе содержимого и помещать в черный список базирующиеся системы против спама.

105
задан SuperBiasedMan 25 August 2015 в 09:42
поделиться

8 ответов

Я могу только сказать, как это делает Mono Project. Теорема довольно проста, хотя и приводит к путанице в коде.

Сначала они компилируют System.Configuration.dll без той части, которая требует ссылки на System.Xml.dll. После этого они компилируют System.Xml.dll обычным способом. Теперь пришло волшебство. Они перекомпилируют System.configuration.dll, при этом часть требует ссылки на System.Xml.dll. Теперь есть успешная компиляция с циклической ссылкой.

Вкратце:

  • A компилируется без кода требуется B и ссылка на B.
  • B скомпилирован.
  • A перекомпилирован.
57
ответ дан 24 November 2019 в 04:01
поделиться

RBarryYoung и Dykam что-то замышляют. Microsoft использует внутренний инструмент, который использует ILDASM для дизассемблирования сборок, удаления всех внутренних / личных вещей и тел методов и повторной компиляции IL (с использованием ILASM) в так называемую «обезвоженную сборку» или сборку метаданных. Это происходит каждый раз при изменении публичного интерфейса сборки.

Во время сборки сборки метаданных используются вместо реальных. Таким образом цикл нарушается.

35
ответ дан 24 November 2019 в 04:01
поделиться

Это можно сделать так, как описано в Dykam, но Visual Studio не позволяет вам это делать.

Вам придется использовать командную строку компилятор csc.exe напрямую.

  1. csc / target: library ClassA.cs

  2. csc / target: library ClassB.cs /reference:ClassA.dll

  3. csc / target: library ClassA.cs ClassC.cs / reference : ClassB.dll


//ClassA.cs
namespace CircularA {
    public class ClassA {
    }
}


//ClassB.cs
using CircularA;
namespace CircularB {
    public class ClassB : ClassA  {
    }
}


//ClassC.cs
namespace CircularA {
    class ClassC : ClassB {
    }
}
26
ответ дан 24 November 2019 в 04:01
поделиться

Это довольно просто сделать в Visual Studio, если вы не используете ссылки на проекты ... Попробуйте следующее:

  1. Откройте визуальную студию
  2. Создайте 2 проекта библиотеки классов "ClassLibrary1 "&" ClassLibrary2 ".
  3. Сборка
  4. Из ClassLibrary1 добавьте ссылку на ClassLibrary2, перейдя к DLL, созданной на шаге 3.
  5. Из ClassLibrary2 добавьте ссылку на ClassLibrary1, перейдя к dll, созданной на шаге 3.
  6. Выполните повторную сборку (Примечание: если вы внесете изменения в оба проекта, вам придется выполнить сборку дважды, чтобы обе ссылки были «свежими»)

Вот как вы это делаете. А если серьезно ... НИКОГДА не делайте этого в реальном проекте! Если вы это сделаете, Санта в этом году не принесет вам подарков.

17
ответ дан 24 November 2019 в 04:01
поделиться

Множество инструментов , включая Illustrator, позволяют экспортировать изображения XAML в разные форматы. Идеальная цель - это ResourceDictionary , содержащий панель Canvas или Grid , содержащую ваше векторное изображение. Затем вы можете сослаться на словарь в своем Window.Resources и просто добавить панель изображения (которая представляет собой Canvas или Grid ) на панель верхнего уровня Window. .

6
ответ дан 24 November 2019 в 04:01
поделиться

Ну, я никогда не делал этого в Windows, но я делал он во многих средах compile-link-rtl, которые послужили его практическими предшественниками. Что вы делаете, так это сначала создаете «цели» заглушки без перекрестных ссылок, затем связываете, затем добавляете циклические ссылки, а затем повторно связываете. Компоновщики обычно не заботятся о циклических ссылках или следовании цепочкам ссылок, они заботятся только о том, чтобы иметь возможность разрешить каждую ссылку самостоятельно.

Итак, если у вас есть две библиотеки, A и B, которые должны ссылаться друг на друга, попробуйте что-то вроде этого:

  1. Ссылка A без ссылок на B.
  2. Ссылка B с refs на A.
  3. Ссылка A, добавление ссылок на B.

Dykam делает хорошее замечание: это компиляция, а не ссылка в .Net, но принцип остается тем же: сделайте ваши источники перекрестными ссылками с их экспортированными точками входа, но со всеми, кроме одного, с их собственными ссылками на другие, заглушенными. Постройте их вот так. Затем отключите внешние ссылки и перестройте их. Это должно работать даже без каких-либо специальных инструментов, на самом деле этот подход работал на каждой операционной системе, в которой я когда-либо пробовал (около 6 из них). Хотя, очевидно, что то, что автоматизирует, будет большим подспорьем.

этот подход работал в каждой операционной системе, в которой я когда-либо пробовал (около 6 из них). Хотя, очевидно, что то, что автоматизирует, будет большим подспорьем.

этот подход работал в каждой операционной системе, в которой я когда-либо пробовал (около 6 из них). Хотя, очевидно, что то, что автоматизирует, будет большим подспорьем.

4
ответ дан 24 November 2019 в 04:01
поделиться

Один из возможных подходов - использовать условную компиляцию (#if) для первой компиляции System.dll, которая не зависит от них. другие сборки, затем скомпилируйте другие сборки и, наконец, перекомпилируйте System.dll, чтобы включить части, зависящие от XML и конфигурации.

1
ответ дан 24 November 2019 в 04:01
поделиться

Технически возможно, что они вообще не были скомпилированы, а собраны вручную. В конце концов, это библиотеки низкого уровня.

0
ответ дан 24 November 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: