Почему сборка .NET Standard 2 ссылается на множество сборок вместо одной сборки netstandard.dll - PullRequest
0 голосов
/ 15 мая 2019

В отличие от .NET Standard 1, .NET Standard 2 представляет единую netstandard.dll справочную сборку.

Однако при компиляции (с .NET Core SDK 2.2.203) с dotnet build мы видим, что он добавляет ссылки на многие сборки (113), все в netstandard.library/2.0.3/build/netstandard2.0/ref/*.dll. Одна из этих ссылок - netstandard.dll.

$ grep TargetFramework *.csproj
<TargetFramework>netstandard2.0</TargetFramework>
$ dotnet build --verbosity normal | grep -o netstandard.library/2.0.3/build/netstandard2.0/ref | wc -l
113

Получившаяся сборка содержит единственную ссылку на стандарт:

$ ikdasm test.exe | grep extern
.assembly extern netstandard

Вопрос в том, почему netstandard.library пакет NuGet содержит все эти другие сборки и почему они используются во время сборки, вместо ссылки на один netstandard.dll.

1 Ответ

2 голосов
/ 15 мая 2019

К сожалению, это связано с историей.

Вы правы, что теоретически для создания библиотеки .NET Standard требуется только netstandard.dll.

Однако две вещи усложняют это:

  1. .NET Standard 1.0-1.6 библиотеки использовали намного больше пакетов NuGet и, следовательно, сборок.Таким образом, библиотека .NET Standard 1.6 (файл .dll) может содержать ссылки, например, System.Collections.Generic.dll для разрешения.Кроме того, система сборки должна знать, что классы, ожидаемые библиотекой 1.6 в этой dll, фактически совпадают с классами в netstandard.dll.
  2. . Существующим библиотекам .NET Framework разрешено использование из .NET Standard.(и .NET Core) библиотеки без необходимости перекомпиляции.Это означает, что они также были созданы для файлов .dll, которые использует .NET Framework - от mscorlib.dll до отдельных библиотек каркасов.

Для обоих из них ссылки на сборки с этими именами(и версии) добавлены, которые содержат только декларации типа вперед.Так, например, mscorlib.dll будет содержать пустую запись System.Object, которая помечена как «go look for this in netstandard.dll».

...