1

背景

我有一个 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”对应于我可以通过配置管理器选择的构建配置(与标准的“发布”构建选项相反)。

我遇到的问题是我必须将这个#if 指令包装起来的一些代码位于标题为“ Windows 窗体设计器生成的代码”区域的 WinForm.Designer.cs 文件中。

似乎正在发生的事情是,当我对某些表单属性进行更改时,整个代码区域似乎被删除并重新生成,从而删除了我添加的#if 部分。

  • 我会以正确的方式解决这个问题吗?
  • 有没有办法避免丢失我在 WinForm.Designer.cs 代码中所做的更改的情况?

我真的很感谢任何有条件编译和这类东西经验的人的任何建议。

4

3 回答 3

2

#if 方法的一个问题是,您可能会很快陷入这样一种情况,即您有多个 #if 语句用于不同的编译。很快就很难分辨哪个代码块与哪个项目一起使用。

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

所有通用代码仍将存在于一个位置,并且您的服务器和客户端变得更具可读性。您不再需要担心仅客户端更改会影响服务器,反之亦然。加上适当的文件夹组织,您可以将项目的内容(抽象概念,如客户端/服务器)与方式(具体实现,如表单)区分开来。

于 2011-03-14T23:14:16.903 回答
2
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent() {

纳夫说。通过将代码放入表单构造函数来解决您的问题:

    public Form1() {
        InitializeComponent();
#if !SERVERBUILD
        panel1.Visible = false;
#endif
    }

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

于 2011-03-14T23:30:04.233 回答
1

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

您将需要采用一种新方法并弄清楚如何在不更改自动生成代码的情况下完成您需要完成的工作,因为这绝对是一条令人沮丧的道路。

于 2011-03-14T23:10:37.780 回答