Есть ли символ препроцессора, соответствующий флагу / unsafe? - PullRequest
6 голосов
/ 28 февраля 2009

Я имею дело с WriteableBitmap в C #. В настоящее время я использую небезопасный кодовый блок для прямого доступа к пикселям через WriteableBitmap.BackBuffer. Однако я предпочел бы не зависеть от опции /unsafe, поэтому я вместо этого планирую использовать WriteableBitmap.WritePixels.

Существует ли какой-либо способ условной компиляции в «небезопасной» версии, такой, чтобы его можно было использовать при использовании параметра / unsafe для компиляции, не требуя ручной интеграции в файл моего проекта?

Короче, я ищу что-то вроде:

#if UNSAFE
   //my unsafe version
#else
   //the supposedly safe version goes here
#endif

Обнаружение во время выполнения тоже хорошо; но это означает, что мне всегда нужно компилировать с /unsafe, и это означает, что код библиотеки потребует обновления файла проекта, что менее удобно.

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

Ответы [ 3 ]

4 голосов
/ 28 февраля 2009

Я рекомендую вам создать одну или несколько новых конфигураций с помощью диспетчера конфигурации, например, «Небезопасная отладка» и «Небезопасный выпуск», в которых есть существующие параметры, а также отметить «Небезопасно» и добавить условный символ UNSAFE. Вместо того, чтобы переключать небезопасные параметры, вы использовали бы небезопасную конфигурацию.

Можно также изменить конфигурации, чтобы изменить выходное имя небезопасной сборки, чтобы у вас было две сборки, скажем, Bitmaps.dll и Bitmaps.Unsafe.dll, и клиент сборки может решить, какой вариант лучше всего соответствует его потребностям, указав на какую сборку он ссылается.

1 голос
/ 28 февраля 2009

Я бы посоветовал вам скомпилировать с /unsafe /define:SAFE. Возможно, есть другой способ, о котором я не знаю.

0 голосов
/ 28 февраля 2009

Я думаю, вы можете попробовать этот код

#define UNSAFE
#undef UNSAFE // comment this line out if you want to compile the save version

Тогда вы можете использовать код, который вы дали в своем примере.

...