Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在编译过程中可以只包含某些表单吗_C#_.net_Conditional Compilation - Fatal编程技术网

C# 在编译过程中可以只包含某些表单吗

C# 在编译过程中可以只包含某些表单吗,c#,.net,conditional-compilation,C#,.net,Conditional Compilation,我们正在开发一个应用程序的两个版本。不是在应用程序的lite版本与标准版本的意义上,其中一个版本将具有有限的功能等。实际上,我们将在应用程序中显示不同类型的信息,具体取决于版本(这是我描述它的最佳方式,无需过多细节) 为了区分应用程序的两个版本,我们考虑使用条件属性和#if指令(如果有任何其他选项或比这两个更好的方法,我愿意听取建议)。经过一些研究和辩论,我们决定采用#if方法,因为它不会在编译过程中包含不必要的代码(而conditional属性只会删除对不满足条件的方法的调用,但仍然包含这些方

我们正在开发一个应用程序的两个版本。不是在应用程序的lite版本与标准版本的意义上,其中一个版本将具有有限的功能等。实际上,我们将在应用程序中显示不同类型的信息,具体取决于版本(这是我描述它的最佳方式,无需过多细节)

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

无论如何。。。我们现在想知道的是,是否有一种方法可以在编译过程中包含某些windows窗体,这取决于我们编译的应用程序的版本。我们把所有的逻辑都分离了出来,所以表单实际上只是表单,里面只有很少的代码(主要是对处理所有业务逻辑的表单管理器类的调用)。表单管理器类将包含一些#if语句,因此只要有可能,代码可以在应用程序的两个版本中重用(而不是创建两个类并在类上放置条件属性…尽管这可能是我们应该考虑的)

有人知道这样做的好方法吗

短暂性脑缺血发作

更新:


这只是我们实际决定做什么的参考。我们将表单的不同版本放在不同的名称空间中,然后只需在名称空间周围使用#if语句,并在管理所有表单的类的顶部使用语句。另一种方法是使用OO继承:将两个版本共有的功能放在一个超类中,然后创建单独的子类,为每个版本定义超类的专门化

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


这样做既不使用条件编译,也不使用条件生成选项。

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

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

与复制源模块不同,添加为链接将在新项目中包含对现有源的引用。这样,您可以有N个项目,每个项目都有不同的源模块组合。我将其与公共模块源代码中的#if语句结合使用,以生成库的不同版本


为什么不简单地将整个
表单
类放入一个条件if?我们是否必须对每个部分类文件(如设计器使用所有windows组件代码创建的文件等)执行此操作?我们可能必须采取此方法。。。直到我们进入了编码过程,我们才真正意识到我们将拥有两个版本的应用程序。我希望有一种更简单的方法,尽管这可能并不困难,因为我们已经以模块化的方式设计了我们的逻辑。除了表单之间的可视化设计器中的UI更改之外,这一切都适用。