您是否可以在编译期间仅包含某些表单

时间:2009-05-11 17:02:55

标签: c# .net conditional-compilation

我们正在开发两个版本的应用程序。不是应用程序的精简版和标准版,其中一个版本将具有有限的功能等。我们将在应用程序中实际显示不同类型的信息,具体取决于版本(这是我可以描述它的最佳方式)进入太多细节)。

为了区分我们考虑使用条件属性和#if指令的应用程序的两个版本(如果有任何其他选项或比这两个更好的方法,我愿意接受建议)。经过一些研究和辩论后,我们决定采用#if方法,因为在编译过程中不会包含不必要的代码(而条件属性只会删除对不符合条件的方法的调用,但仍然包括方法......如果我没有记错的话)。我意识到这两者并不是相互排斥的,所以如果需要,我们总是可以混合搭配。

无论如何......我们现在想知道的是,在编译期间是否有办法包含某些窗体,基于我们正在编译的应用程序版本。我们已经拆分了所有逻辑,因此表单实际上只是表单,其中包含很少的代码(大多数只是调用处理所有业务逻辑的表单管理器类)。表单管理器类将包含其中的一些#if语句,因此代码可以在应用程序的两个版本中重用,尽可能(而不是制作两个类并在类上放置条件属性...尽管可能这是我们应该考虑的事情。)

是否有人知道这样做的好方法?

TIA

更新:

仅仅是我们实际决定做的一个FYI。我们将表单的不同版本放入单独的命名空间中,然后只需在命名空间的#if语句中使用管理所有表单的类顶部的语句。做得非常光滑,非常轻松。

3 个答案:

答案 0 :(得分:3)

另一种方法是使用OO继承:在超类中放置两个版本共有的功能,然后创建单独的子类,为每个版本定义超类的特化。

然后,您可以将超类[es]构建为共享库,并在单独的程序集(引用公共共享库)中构建每个专用子类。

这样做不使用条件编译,也不使用条件构建选项。

答案 1 :(得分:3)

我用图书馆项目做这件事。我生成另一个项目(.csproj),然后在该项目中包含现有的源代码。在VS2008中,右键单击新项目,单击“添加现有项目...”,然后单击“而不是单击添加”,使用选择箭头选择“添加为链接”。

添加为链接,而不是复制源模块,将包含对现有源的引用,添加到新项目中。这样您就可以拥有N个项目,每个项目都有不同的源模块组合。我将它与通用模块源中的#if语句一起使用,以生成不同版本的库。

Add Existing Item http://www.freeimagehosting.net/uploads/th.eff09391e9.png full image

Add as Link http://www.freeimagehosting.net/uploads/th.f12b764887.png full image

答案 2 :(得分:1)

ChrisW建议的解决方案可能是正确的方法。但是,它可能涉及对您的设计进行大量更改,因此这是另一个:不是为同一个项目提供多个配置,而是使用相同的源创建另一个项目。要做到这一点,最简单的方法是创建.csproj文件的副本并将其包含在解决方案中