Должен ли я смешать мой безопасный код с моим небезопасным кодом? - PullRequest
7 голосов
/ 19 февраля 2010

Я работаю над проектом, который использует несколько вызовов API WIN32 и требует небезопасного кода.С точки зрения передового опыта, следует ли мне изолировать этот код в его собственной DLL, скомпилированной с ключом / unsafe, сохраняя при этом мое главное приложение безопасным?Есть ли причина не компилировать проект с параметром / unsafe?Есть ли потенциальные риски?

1 Ответ

7 голосов
/ 19 февраля 2010

Сборка по определению является наименьшей единицей независимо обновляемого, распространяемого кода в .NET.Поэтому первый вопрос, который я хотел бы задать себе: «Хочу ли я когда-нибудь создать новую версию небезопасного кода и распространять ее независимо от моего приложения?»

Если ответ «да», то непременнопоместите этот код в его собственную сборку.

Если ответ отрицательный, рассмотрите другие факторы.Например, в «классической» безопасности .NET вы можете иметь разные сборки, работающие с разными уровнями доверия в одном и том же домене приложения.(В современном CLR система намного проще, есть просто полностью доверенный код, а все остальное выполняется на уровне доверия, предоставленного домену приложения.) Ваш код, который делает что-то небезопасное, должен быть полностью доверенным, но код, который просто вызываетоно может быть менее надежным, если небезопасный код устанавливает правильный набор разрешений.

Будете ли вы когда-нибудь в ситуации, когда ваш безопасный код будет частично доверенным?Если это так, то непременно поместите небезопасный код в его собственную сборку, а затем задокументируйте, что эта сборка должна быть полностью доверенной.

Если вы не находитесь в подобных ситуациях, я бы не стал склонятьсяпоместить мой небезопасный код в его собственную сборку.

Я бы, однако, был склонен написать приятную модель управляемого объекта поверх моего неуправляемого кода, а не просто показывать необработанные вызовы win32.Например, на днях мне нужно было вызвать некоторые из API-интерфейсов win32 для проверки строгих имен из C #, и я просто собрал небольшую библиотеку, которая хорошо их показала, абстрагируя все неприятные детали взаимодействия с частным внутренним пространством класса.

...