Подтвердить что ты не робот

Как компилятор С# решает исправить ссылки на перенастраиваемые сборки?

В .NET Compact Framework были введены ссылки на переназначаемые сборки, которые теперь используются для поддержки переносимых библиотек классов.

В принципе, компилятор испускает следующий MSIL:

.assembly extern retargetable mscorlib
{
    .publickeytoken = (7C EC 85 D7 BE A7 79 8E )                         
    .ver 2:0:5:0
}

Как компилятор С# понимает, что он должен испускать ссылку переназначения и как заставить компилятор С# выдавать такую ​​ссылку даже за пределами переносимой библиотеки классов?

4b9b3361

Ответ 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). Я не нашел, как компилятор решает сделать сборку перенастраиваемой.