Можете ли вы включить только определенные формы во время компиляции - PullRequest
3 голосов
/ 11 мая 2009

Мы разрабатываем две версии приложения. Не в смысле облегченной или стандартной версии приложения, где одна версия будет иметь ограниченную функциональность и т. Д. На самом деле мы будем отображать различные типы информации в приложении в зависимости от версии (это лучший способ описать это без вдаваясь в слишком много деталей).

Чтобы различать две версии приложения, которые мы рассмотрели, использовали условный атрибут и директиву #if (если есть какие-либо другие варианты или лучший способ, чем эти две, я открыт для предложений). После некоторых исследований и дебатов мы решили использовать подход #if, так как он не будет включать ненужный код во время процесса компиляции (тогда как условный атрибут просто удалит вызовы методов, которые не удовлетворяют условию, но все же включайте методы ... если я не ошибаюсь). Я понимаю, что они не являются взаимоисключающими, поэтому мы всегда можем смешивать и сопоставлять, если это будет необходимо.

В любом случае ... Что нам сейчас интересно, так это если есть способ только включить определенные формы окон во время компиляции, основываясь на том, какую версию приложения мы компилируем. Мы разделили всю логику, поэтому формы на самом деле являются просто формами с очень небольшим количеством кода внутри (в основном это просто вызовы классов диспетчера форм, которые обрабатывают всю бизнес-логику). Классы диспетчера форм будут содержать некоторые операторы #if внутри них, поэтому код можно повторно использовать в обеих версиях приложения, когда это возможно (вместо создания двух классов и помещения условного атрибута в классы ... хотя, возможно, это то, что мы должны учитывать).

Кто-нибудь знает хороший способ сделать это?

1011 * ТИА *

UPDATE:

Просто к вашему сведению то, что мы на самом деле решили сделать. Мы поместили разные версии форм в отдельные пространства имен, а затем нам пришлось использовать только оператор #if вокруг пространства имен, используя оператор в верхней части класса, который управляет всеми формами. Работал довольно гладко и очень ласково.

Ответы [ 3 ]

3 голосов
/ 11 мая 2009

Я делаю это с библиотечными проектами. Я создаю другой проект (.csproj), а затем включаю в него существующие источники. В VS2008 щелкните правой кнопкой мыши новый проект, щелкните Добавить существующий элемент ... и затем вместо нажатия Добавить , используйте стрелку выбора, чтобы выбрать «Добавить как ссылку».

Вместо дублирования исходных модулей, Добавить как ссылку будет включать ссылку на существующий источник в новый проект. Таким образом, вы можете иметь N проектов, каждый из которых имеет свою комбинацию исходных модулей. Я использую это в сочетании с утверждениями #if в источнике общих модулей для создания различных версий библиотеки.

Добавить существующий элемент http://www.freeimagehosting.net/uploads/th.eff09391e9.png полное изображение

Добавить как ссылку http://www.freeimagehosting.net/uploads/th.f12b764887.png полное изображение

3 голосов
/ 11 мая 2009

Еще один способ сделать это - использовать OO-наследование: поместить функциональность, общую для обеих версий, в суперкласс, а затем создать отдельные подклассы, которые определяют специализации суперкласса для каждой из ваших версий.

Затем вы можете построить свой суперкласс [es] как разделяемую библиотеку и построить каждый специализированный подкласс в отдельных сборках (которые ссылаются на общую разделяемую библиотеку).

При этом не используются ни условная компиляция, ни опции условной сборки.

1 голос
/ 11 мая 2009

Решение, предложенное ChrisW, вероятно, является правильным способом сделать это. Однако, это может повлечь за собой множество изменений в вашем дизайне, так что вот еще один: вместо нескольких конфигураций для одного и того же проекта, создайте другой проект с теми же источниками. Для этого проще всего создать копию вашего файла .csproj и включить его в решение

...