我可以在C#库中定义全局预处理器吗?

我可以在C#库中定义全局预处理器吗?,c#,.net,c-preprocessor,C#,.net,C Preprocessor,在C#中,可以使用类似于C/C++语法的宏进行条件编译。这将使以下情况得以发生: #define MYMACRO .... #if MYMACRO //some C# code logic #else //some other C# code logic 我需要在C#library项目的专用文件中定义一些宏,一旦定义,这些宏在整个库中都是可见的。问题是上述代码仅适用于单个文件 我知道解决这个问题的另一种方法是将宏添加到build命令中。这将负责为整个.dll定义宏,我将让#if-#else检

在C#中,可以使用类似于C/C++语法的宏进行条件编译。这将使以下情况得以发生:

#define MYMACRO
....
#if MYMACRO
//some C# code logic 
#else
//some other C# code logic
我需要在C#library项目的专用文件中定义一些宏,一旦定义,这些宏在整个库中都是可见的。问题是上述代码仅适用于单个文件

我知道解决这个问题的另一种方法是将宏添加到build命令中。这将负责为整个
.dll
定义宏,我将让
#if-#else
检查在库中任何我想要的地方工作。这种方法的问题在于我希望能够轻松地维护宏。将它们放在项目内部的文件中将是完美的。我也想在里面有一些评论,这样我就能知道每个宏都在做什么。如果我必须将宏作为构建参数传递,则这将不适用。另一个原因是可以通过简单的注释和检查宏的行为来打开/关闭宏

有没有合适的方法来达到我的要求?我不喜欢处理任何代码自动化工具,比如“代码> MSBudio”、“代码> No.<代码>或诸如此类的东西,如果没有其他方法,我会感激你认为是更好选择的建议。

< P>你用一个项目+属性、Bug选项卡、“条件编译符号”设置来定义整个项目。这将设置项目文件中的
元素。通过为该属性提供/property:DefineConstants=“MYMACRO”命令行选项,可以使用msbuild重写该属性。

C#“预处理器”指令与C预处理器指令的工作原理不同。对您来说,最重要的区别在于没有与
#include
等价的内容。在正常情况下不需要它,因为C#没有(或不需要)头文件。我认为您想要的是不可能的,除非您以某种方式创建自己的预处理器,或者使用
#define
s读取文件并将其转换为msbuild的参数

但我认为使用更面向对象的方法会更容易:将不同的方法封装到类中并使用它们。要指定使用哪一个,可以使用依赖项注入。这意味着您必须随库一起提供DI库,但我认为这是值得付出的代价


此外,这种方法还可以缓解条件编译的问题:指定不同的符号集可能会以意外的方式破坏构建。

我还建议按照@Hans Passant的建议,将宏放在项目设置(csproj文件)中

如果需要文档化定义,可以向解决方案添加文档文件,解释设置的含义

如果没有太多的变体,您可以为每个变体定义一个新的项目配置。这将允许您为每个变量预先配置必要的#定义列表,然后从工具栏中的配置组合框在它们之间切换。如果要临时禁用一个选项,可以复制当前配置并删除#define,然后在稍后测试配置时删除它

我可以建议的下一个选项是使用一个简单的文本文件(设置+注释)来配置项目,然后花15分钟编写一个快速的c#应用程序来读取此文件,并将其包含的设置写入.csproj文件-它只是XML,因此应该是一个简单的应用程序来编写。您可以轻松调整此文件并运行更新程序应用程序来更改项目设置。如果这是你经常做的事情,花30分钟在上面,并添加一个带有复选框的UI,以便更轻松地选择设置

不过,你所描述的概念听起来很奇怪。一个库的要点通常是,您有一个标准化的代码块,可以由许多客户机共享,因此更改这些类型的定义以大量重新配置整个库并不是我期望经常需要做的事情。也许你有很好的理由,但也许值得回顾一下为什么你需要解决这个定义问题


(例如,如果您有许多客户需要“库”的不同变体,最好的方法是使用配置(如上所述)允许您在批构建中构建所有需要的变体。如果您只是在尝试许多不同的算法/技术,那么您是否可以重新设计库的块,以便将大多数#定义的影响限制在单个.cs文件中,从而使它们不再需要是全局的?也许库不应该位于单个dll或plu中需要g-in体系结构,以允许您使用GUI拾取和选择库中包含的“模块”

  • 在Visual Studio中打开项目
  • 在解决方案资源管理器中的项目文件上单击鼠标右键,转到“属性”
  • 转到
    构建选项卡
    ,确保在配置下拉列表中选择
    所有配置
  • 确保在
    Platform
    下拉列表中选择了
    All Platforms
  • 条件编译符号
    文本框中键入所需的
    预处理器定义
  • 到项目文件

  • 在文本编辑器中打开项目文件
  • 将此代码复制并粘贴到现有
    PropertyGroup

    
    PDEF1;PDEF2;PDEF3
    

  • 如果不需要添加条件,请删除
    条件=“$(VariableName)”==“VarableValue”
    部分

  • 保存项目文件并从Visual Studio打开

  • From:

    您可以将定义添加到csproj文件中……您的意思是,作为构建参数?我