Как компилятор С# решает исправить ссылки на перенастраиваемые сборки?
В .NET Compact Framework были введены ссылки на переназначаемые сборки, которые теперь используются для поддержки переносимых библиотек классов.
В принципе, компилятор испускает следующий MSIL:
.assembly extern retargetable mscorlib
{
.publickeytoken = (7C EC 85 D7 BE A7 79 8E )
.ver 2:0:5:0
}
Как компилятор С# понимает, что он должен испускать ссылку переназначения и как заставить компилятор С# выдавать такую ссылку даже за пределами переносимой библиотеки классов?
Ответы
Ответ 1
Для самой сборки это флаг сборки, то есть [сборка: AssemblyFlags (AssemblyNameFlags.Retargetable)].
Обратите внимание, что этот флаг не имеет смысла за пределами сборок платформы - пользовательские сборки не могут быть перенацеливы.
Для ссылок он копируется как часть имени из ссылки, на которую ссылаются.
Ответ 2
Не уверен, что это поможет, но следующий файл был автоматически сгенерирован и включен в сборку.
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(
".NETPortable,Version=v4.0,Profile=Profile4",
FrameworkDisplayName = ".NET Portable Subset")]
Это может намекнуть на компилятор, чтобы сделать магию.
Edit:
Я думаю, что выше делает библиотеку переносимой. Из командной строки я вижу, что используется /nostdlib+
, и переносится mscorlib.dll
(который, как я полагаю, имеет тот же атрибут, что и упомянутый выше).
"...\Program Files\Reference Assemblies\Microsoft\Framework.NETPortable\v4.0\Profile\Profile4\mscorlib.dll"
Ответ 3
Я заметил, экспериментируя с тем, что компилятор С# сделает ссылочный компилятор перенацеливаемым, если ссылочная сборка отмечена как перенастраиваемая (модификатор в разделе .assembly
в MSIL). Я не нашел, как компилятор решает сделать сборку перенастраиваемой.