C# 在设计器生成的windows窗体代码中使用if指令进行条件编译

C# 在设计器生成的windows窗体代码中使用if指令进行条件编译,c#,winforms,configurationmanager,conditional-compilation,C#,Winforms,Configurationmanager,Conditional Compilation,背景: 我有一个C Windows窗体应用程序,它包含一个Windows服务和一个用于配置系统设置以及与服务通信的界面 预期结果: 我想构建两个版本的解决方案-一个客户端版本包含所有与Windows服务相关的代码和表单元素,另一个服务器版本包含所有内容 表单包含一个选项卡式控件,其中一个选项卡包含用于使用套接字与Windows服务接口的元素。我真正想要实现的是,对于完整构建,包含服务相关元素的选项卡被编译,而对于条件构建,相同的选项卡被排除 问题: 在这个阶段,我在Windows服务相关代码中使

背景:

我有一个C Windows窗体应用程序,它包含一个Windows服务和一个用于配置系统设置以及与服务通信的界面

预期结果:

我想构建两个版本的解决方案-一个客户端版本包含所有与Windows服务相关的代码和表单元素,另一个服务器版本包含所有内容

表单包含一个选项卡式控件,其中一个选项卡包含用于使用套接字与Windows服务接口的元素。我真正想要实现的是,对于完整构建,包含服务相关元素的选项卡被编译,而对于条件构建,相同的选项卡被排除

问题:

在这个阶段,我在Windows服务相关代码中使用了if指令。例如:

#if SERVERBUILD
     //Code relating to Windows service that I do not want to compile 
     //for a client version.
#endif
在上面的示例中,“SERVERBUILD”对应于我可以通过configuration Manager选择的构建配置,而不是标准的“Release”构建选项

我遇到的问题是,我必须包装此if指令的一些代码位于名为“Windows窗体设计器生成的代码”区域的WinForm.Designer.cs文件中

当我对一些表单属性进行更改时,整个代码区域似乎被删除并重新生成,从而删除了我添加的if部分

我这样做对吗? 有没有办法避免丢失在WinForm.Designer.cs代码中所做的更改?
我非常感谢任何有条件编译经验的人给我的建议。

你能做的不多。表单设计器将生成该代码,并以蛮力的方式执行,而不关心您的需求或所做的更改。你不应该因此而弄乱自动生成的代码


你需要采取一种新的方法,弄清楚如何在不改变autogen代码的情况下实现你所需要的,因为这绝对是一条纯粹的挫折之路。

你无能为力。表单设计器将生成该代码,并以蛮力的方式执行,而不关心您的需求或所做的更改。你不应该因此而弄乱自动生成的代码


您需要采取一种新的方法,并找出如何在不更改autogen代码的情况下实现所需的功能,因为这无疑是一条纯粹的挫折之路。

if方法的一个问题是,您可能会很快陷入一种情况,即对于不同的编译有多个if语句。很快就很难判断哪段代码与哪个项目相匹配

更好的解决方案是识别所有通用代码,并将它们保存在单独的项目文件夹中,例如common/。例如,在server/下有特定的服务代码,在client/下有所有表单代码


所有通用代码仍将存在于一个位置,服务器和客户端的可读性将大大提高。您不再需要担心仅客户端的更改会影响服务器,反之亦然。另外,通过适当的文件夹组织,您可以将项目抽象概念(如客户机/服务器)与具体实现(如表单)分开。

if方法的一个问题是,您可能会很快陷入一种情况,即对于不同的编译有多个if语句。很快就很难判断哪段代码与哪个项目相匹配

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent() {
更好的解决方案是识别所有通用代码,并将它们保存在单独的项目文件夹中,例如common/。例如,在server/下有特定的服务代码,在client/下有所有表单代码

所有通用代码仍将存在于一个位置,服务器和客户端的可读性将大大提高。您不再需要担心仅客户端的更改会影响服务器,反之亦然。另外,通过适当的文件夹组织,您可以将项目抽象概念(如客户机/服务器)与具体实现(如表单)分开

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent() {
请注意,使用面板是使其上的所有控件不可见的简单方法


请注意,使用面板是使其上的所有控件不可见的一种简单方法。

您能否提供代码的概述?在哪里做什么?我怀疑您在将GUI与逻辑解耦方面存在一个主要问题。这不是一个解耦问题,因为我不想控制GUI元素以外的代码。我添加了更多关于我要做什么的细节。你能提供你的代码的概述吗?在哪里做什么?我怀疑您在将GUI与逻辑解耦方面存在一个主要问题。这不是一个解耦问题,因为我不想控制GUI元素以外的代码。我
DDE提供了更多关于我尝试做什么的详细信息。感谢您的建议,该应用程序经过几年的缓慢发展,最初并没有计划构建客户端和服务器。我会尝试为新的应用程序这样做。毫无疑问,一开始工作会更难。但从长远来看,回报要大得多。感谢您的建议,这款应用程序经过几年的缓慢发展,最初并不打算构建客户端和服务器。我会尝试为新的应用程序这样做。毫无疑问,一开始工作会更难。但从长远来看,回报要大得多。是的,我看得越多,它看起来就越错。我想我的想法是使用if进行编译,但走错了路。谢谢你的意见。是的,我看得越多,它看起来就越错。我想我的想法是使用if进行编译,但走错了路。谢谢你的意见。