Как может одна сборка .NET, ориентированная одновременно на версии 2.0, 3.0, 3.5, 4.0 и 4.5, поддерживать методы расширения для потребителей C # и VB.NET?
Стандартное предложение - добавить следующее:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
Этот подход предложен подробнее чем один сотрудник Microsoft и даже был представлен в журнал MSDN. Это широко приветствуется у многих блоггеров как« без вредных последствий ».
О, за исключением того, что это вызовет ошибку компилятора из проекта VB.NET, ориентированного на .NET 3.5 или выше.
Разобрались авторы Microsoft.Core.Scripting.dll и изменил "общедоступный" на "внутренний".
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
Что, казалось, решило проблему совместимости с VB.
Поэтому я с доверием использовал этот подход для последней версии (3.2.1) широко используемой библиотеки ImageResizing.Net.
Но тогда мы начинаем получать эту ошибку компилятора (исходный report), более или менее случайно, для определенных пользователей, ориентированных на .NET 3.5+.
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Поскольку компилятор MSBuild / VisualStudio, очевидно, не заботится о правилах определения области видимости при разрешении конфликтов имен, а порядок ссылок на сборки играет не совсем документированную роль, я не совсем понимаю, почему и когда это происходит.
Есть несколько хитрых обходных решений, таких как изменение пространства имен сборки, воссоздание файла проекта, удаление / чтение System.Core и возиться с целевой версией .NET framework. К сожалению, ни один из этих обходных путей не является стопроцентным (кроме псевдонима, но это недопустимая боль).
Как я могу это исправить, пока
- Поддержка использования метода расширения в сборке,
- Поддержка .NET 2.0 / 3.0
- Не требуется несколько сборок для каждой версии .NET framework.
Или есть исправление, чтобы компилятор обращал внимание на правила области видимости?
Связанные вопросы по SO, которые не отвечают на этот вопрос