【问题标题】:Using the #if directive in designer generated code with windows forms for conditional compilation在设计器生成的代码中使用#if 指令和 Windows 窗体进行条件编译
【发布时间】:2011-07-15 09:52:45
【问题描述】:

背景

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

期望的结果

我想构建两个版本的解决方案 - 一个包含所有 Windows 服务相关代码和表单元素的 client 版本和一个包含所有内容的 server 版本。

表单包含一个选项卡式控件,其中一个选项卡包含用于使用套接字与 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 文件中em>'。

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

  • 我这样做是否正确?
  • 有没有办法避免丢失我在 WinForm.Designer.cs 代码中所做的更改的情况?

我非常感谢任何有条件编译和这类东西经验的人提供的任何建议。

【问题讨论】:

  • 您能否提供您的代码的一般概述?什么是在哪里做的?我怀疑你在将 GUI 与逻辑分离时遇到了一个大问题。
  • 不是解耦问题,因为我不想控制 GUI 元素以外的代码。我添加了一些关于我正在尝试做的事情的更多细节。

标签: c# winforms configurationmanager conditional-compilation


【解决方案1】:

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

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

【讨论】:

  • 是的,越看越觉得不对劲。我想我的想法是能够使用#if 编译错误的路径。感谢您的意见。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的建议,这个应用程序经过几年的缓慢发展,最初并没有计划构建客户端和服务器。我会尝试为新应用执行此操作。
  • 毫无疑问,一开始工作比较辛苦。但从长远来看,回报要大得多。
【解决方案3】:
    /// <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
    }

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

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2017-05-24
    • 1970-01-01
    • 2011-11-08
    • 2023-03-23
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多