你可以在编译时只包含特定的表单吗?

3
我们正在开发两个版本的应用程序,不是指应用程序的lite版和标准版之类,其中一个版本将具有有限的功能等。我们实际上将在应用程序中显示不同类型的信息,具体取决于版本(这是我可以在不涉及太多细节的情况下描述它的最佳方式)。
为了区分应用程序的两个版本,我们考虑使用条件属性和#if指令(如果有其他选项或比这两个更好的方法,我愿意听取建议)。经过一些研究和辩论,我们决定采用#if方法,因为这样在编译过程中不会包含不必要的代码(而条件属性只会删除不符合条件的方法的调用,但仍然包括方法… 如果我没有弄错的话)。我知道这两个不是互斥的,所以如果需要,我们可以混合使用。
无论如何...现在我们想知道是否有一种方法,可以根据我们正在编译的应用程序的哪个版本,仅在编译过程中包含某些窗体表单。我们已经拆分了所有逻辑,因此窗体实际上只是窗体,里面几乎没有代码(主要是对处理所有业务逻辑的窗体管理器类的调用)。窗体管理器类将包含其中的一些#if语句,因此在可能的情况下可以在应用程序的两个版本中重复使用代码(而不是制作两个类并在类上放置条件属性...虽然也许这是我们应该考虑的事情)。
有人知道一种好的方法吗?
更新:
只是一个FYI,我们实际上决定要做什么。我们将表单的不同版本放入单独的命名空间中,然后只需要在管理所有表单的类的顶部使用语句周围使用#if语句即可。效果非常出色,工作量很小。

为什么不直接将整个“Form”类放在条件语句中呢? - Dirk Vollmar
我们需要为每个部分类文件都这样做吗(例如由设计师创建的包含所有窗口组件代码的文件)? - Jason Down
3个回答

3
另一种方法是使用OO继承:将适用于两个版本的功能放在超类中,然后创建不同的子类,为每个版本定义超类的专业化。您可以将超类构建为共享库,然后在单独的程序集中构建每个专门的子类(这些程序集引用公共共享库)。这样做不需要条件编译或条件构建选项。

我们可能不得不采取这种方式...直到我们深入编码过程,我们才意识到我们将有两个应用程序版本。我希望有一种更简单的方法,但由于我们以模块化的方式设计了逻辑,所以这可能并不困难。 - Jason Down
除了在窗体间的可视化设计器中进行的 UI 更改之外,这对所有事情都有效。 - Mat Nadrofsky

3
我使用库项目来做到这一点。我创建另一个项目(.csproj),然后将现有的源代码包含到该项目中。在VS2008中,右键单击新项目,点击"添加现有项",然后不要点击添加,使用选择箭头选择"添加为链接"。
与复制源模块不同,添加为链接会将对现有源代码的引用包含到新项目中。这样,您可以拥有N个项目,每个项目都有不同的源模块组合。我与常见模块源代码中的#if语句一起使用,以生成库的不同版本。 添加现有项 http://www.freeimagehosting.net/uploads/th.eff09391e9.png 完整图片 添加为链接 http://www.freeimagehosting.net/uploads/th.f12b764887.png 完整图片

1
ChrisW提出的解决方案可能是正确的方法。然而,它可能涉及对您的设计进行大量更改,因此这里有另一种方法:不要为同一项目创建多个配置,而是创建另一个具有相同源代码的项目。为此,最简单的方法是创建.csproj文件的副本并将其包含在解决方案中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接