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