Компиляция небезопасного кода на C#
У меня есть небольшой класс C# с несколькими небезопасными методами. Есть ли способ указать опцию "/unsafe" декларативно в исходном коде C# (с #pragma
или как-нибудь еще) только для контекста исходного файла класса? Я не хотел бы создавать отдельную сборку для такого маленького класса, но я также не хочу, чтобы остальная часть сборки (класс в настоящее время является частью) была включена для небезопасного кода.
2 ответа
Нет, это (в настоящее время) невозможно, поскольку на всю сборку влияет небезопасный код.
Включая небезопасный код в вашу сборку, вы сообщаете CLR, что сборка может что-то делать, что небезопасно, что меняет поведение среды выполнения при загрузке сборки. Самым большим изменением здесь является то, что CLR просто не будет пытаться проверить ваш небезопасный код, но также откажется загружать вашу сборку, если у нее нет полного доверия (например, вы не можете загрузить небезопасную сборку как обычный пользователь по клику - один раз.)
С технической точки зрения, когда вы используете /unsafe
опция, это заставляет компилятор выдавать эквивалент IL следующих атрибутов уровня модуля в вашу сборку:
[assembly:SecurityPermission(SkipVerification = true)]
[assembly:UnverifiableCode]
Как вы сказали, лучший вариант - максимально изолировать небезопасный код в отдельной сборке. Тот факт, что сборка содержит только один класс, является гораздо меньшим запахом кода, чем заражение всей сборки, полной безопасного кода, из-за одного небезопасного класса.
C# имеет unsafe
ключевое слово, которое вы должны использовать вокруг небезопасного кода, просто чтобы избежать случайного использования людьми небезопасного кода. Это такой же хороший подход, как и любой другой: если кто-то может представить unsafe
ключевое слово в файле, они могут так же легко добавить или удалить #pragma
тег или что-то подобное.
/unsafe
тег компилятора говорит компилятору, что вы в порядке с людьми, использующими unsafe
ключевое слово в этой сборке, и вы узнаете, что генерируемая сборка будет помечена как "небезопасная", что может помешать ее запуску в средах с уровнем неполного доверия. Нет способа заставить компилятор помечать только отдельные классы как опасные: люди могут либо доверять вашей сборке, либо нет.