Различные версии одной программы

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Различные версии одной программы

Сообщение areh » 19.05.2004 (Ср) 14:23

Такой вопрос, пишу я приложение, причем оно будет распространяца с различным набором возможностей, и соответственно немного разными названиями и т.д. Хотелось бы узнать, как лучше всего сделать разделение по версиям?

просто хочеться писать одно приложение, а остальные версии (грубо говоря "обрезанные") получались сами собой..

Подскажите, как это организовать? Как я понимаю, надо использовать #IF ...

но как сделать разными названия файла, св-ва проекта, и т.д.?
так же интересует как можно не включать определённые формы, классы...

но вообще можно немного поподробней и о #IF, т.е. какие константы можно использовать, где они объявляються

заранее спасибо...

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 19.05.2004 (Ср) 20:29

ЧИтай MSDN!


MSDN писал(а):Conditional compilation directives control conditional compilation and can only reference constant expressions and conditional compilation constants. Each of the constant expressions within a single conditional compilation group is evaluated and converted to the Boolean type in textual order from first to last until one of the conditional expressions evaluates to True. If an expression is not convertible to Boolean, a compile-time error results. Permissive semantics are always used when evaluating conditional compilation constant expressions, regardless of any Option directives or compilation environment settings.
All lines enclosed by the group, including nested conditional compilation directives, are disabled except for lines between the statement containing the True expression and the next conditional statement of the group, or lines between the Else statement and the End If statement if an Else appears in the group and all of the expressions evaluate to False.
In this example, the call to WriteToLog in the Trace conditional compilation directive is not processed because the surrounding Debug conditional compilation directive evaluates to False.
#Const Debug = False ' Debugging off
#Const Trace = True ' Tracing on

Class PurchaseTransaction
Sub Commit()
#If Debug Then
CheckConsistency()
#If Trace Then
WriteToLog(Me.ToString())
#End If
#End If
CommitHelper()
End Sub
End Class


А тут пример аж для тебя:


MSDN писал(а):Conditionally compiles selected blocks of Visual Basic code.

#If expression Then
statements
[ #ElseIf expression Then
[ statements ]
...
#ElseIf expression Then
[ statements ] ]
[ #Else
[ statements ] ]
#End If
Parts
expression
Required for If and ElseIf statements, optional elsewhere. Any expression, consisting exclusively of one or more conditional compiler constants, literals, and operators, that evaluates to True or False. Three conditional compilation constants are provided: Config, Debug, and Trace. Debug and Trace are Boolean datatypes and can be set in the Project Properties dialogue. When Debug is defined, Debug class methods generate output to the Output window. When it is not defined, Debug class methods are not compiled and no Debug output is generated. Similarly, when Trace is defined, Trace class methods generate output to the Output window. When it is not defined, Trace class methods are not compiled and no Trace output is generated. Config is a string datatype, which corresponds to the current setting in the Configuration Manager.
statements
Required for If statement block, optional elsewhere. Visual Basic program lines or compiler directives that are compiled if the associated expression evaluates to True.
#End If
Terminates the #If statement block.
Remarks
On the surface, the behavior of the #If...Then...#Else directives appears the same as that of the If...Then...Else statements. However, the #If...Then...#Else directives evaluate what is compiled by the compiler, whereas the If...Then...Else statements evaluate conditions at run time.

Conditional compilation is typically used to compile the same program for different platforms. It is also used to prevent debugging code from appearing in an executable file. Code excluded during conditional compilation is completely omitted from the final executable file, so it has no effect on size or performance.

Regardless of the outcome of any evaluation, all expressions are evaluated using Option Compare Text. The Option Compare statement does not affect expressions in #If and #ElseIf statements.

Note No single-line form of the #If, #Else, #ElseIf, and #End If directives exists; that is, no other code can appear on the same line as any of the directives.
Example
This example uses the #If...Then...#Else construct to determine whether to compile certain statements.

#Const CustomerNumber = 36
#If CustomerNumber = 35 Then
' Insert code to be compiled for customer # 35.
#ElseIf CustomerNumber = 36 Then
' Insert code to be compiled for customer # 36.
#Else
' Insert code to be compiled for all other customers.
#End If


Вот как в этом примере - так и делай. Номер пользователя и по ней собираешь сборку.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 20.05.2004 (Чт) 13:27

Большое спасибо, разобрался...

areh
Постоялец
Постоялец
 
Сообщения: 530
Зарегистрирован: 02.12.2002 (Пн) 12:28
Откуда: РОССИЯ, Салехард

Сообщение areh » 20.05.2004 (Чт) 22:51

наконец-то появилось время немного потестировать условную компиляцию, и если честно, результаты не сильно впечатлили. Вообщем я создал windows приложение с 2-мя формами, набросал на них всяких компонент, сделал модуль в нем процедуру Main которая и запускалась и показывала messagebox. одну из форм полностью заключил в #if ... #End if, и получил следующие результаты:

36 Кб - полная компиляция, т.е. форма компилируеться
21,5 Кб - условие #If нарушаеться -> форма не компилируеться
14,5 Кб - просто удалил форму из проекта...

потом я в тот же модуль где находиться процедура Main вставил один класс, при компиляции файл получился размером 19 Кб, но вот когда я изменил константу, и этот класс не скомпилировался, я получил прежние 14,5 Кб

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

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

так же не остался решенным вопрос о смене имен компилируемых файлов и их свойств

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.05.2004 (Пт) 0:17

Весьма удобно для этой цели использовать SourceSafe. Создаёшь два проекта в разных папках, а в SS шаришь общие файлы. При изменении расшаренных модулей делаешь Get Latest Version и перекомпилируешь.

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 21.05.2004 (Пт) 10:02

skiperski писал(а):Весьма удобно для этой цели использовать SourceSafe. Создаёшь два проекта в разных папках, а в SS шаришь общие файлы. При изменении расшаренных модулей делаешь Get Latest Version и перекомпилируешь.


Нет, не очень удобно. Стоит один раз забыть - и проекты расхордятся в разные стороны, как в море корабли :). Несовместимость и т.д. и т.п. С "условиями" гораздо проще.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 21.05.2004 (Пт) 12:06

Во-первых, надо тренировать свой склероз. :D

Во-вторых, можно написать прожку, которая будет генерить билды сама. Интерфас SS открытый, компилировать умеем, номера версий подправить в файле проекта не сложно. Я именно так и делал.

В-третьих, никто не говорил о бесполезности #If #Else #End If. В общих модулях ими можно выключать неиспользуемые блоки кода. Просто с использованием SS не надо таскать ненужные модули вообще.

Например, в основной проге 10 форм, 5 модулей, в 3-х из которых публичные декларации, и пара классов. В демо-версии только 3 формы и общие модули с сокращённым функционалитетом. Тогда во вторую папку шарим нужные формы и модули, а уже в самих модулях ненужное отсекаем инструкциями, значения которых прописываем в св-вах проекта. Также исчезает проблема с индивидуальным именем проекта. Перед компиляцией делаем Get Latest Version.

Проблема с несовместимостью версий может возникнуть только в случае если это ActiveX или DLL и сначала была установлена демка, а потом её заменяют на полную версию. Тогда, конечно, ключи совпадать не будут (т.к. разные проекты), но даже в этом случае, по-моему, можно как-то выкрутиться задавая их ручками в св-вах проекта (как не знаю).


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

    TopList  
cron