Iva*_*vov 6 .net c# c-preprocessor
在C#中,您可以使用类似于C/C++语法的宏进行条件编译.这将使以下事件发生:
#define MYMACRO
....
#if MYMACRO
//some C# code logic
#else
//some other C# code logic
Run Code Online (Sandbox Code Playgroud)
我需要在C#库项目的专用文件中定义一些宏,一旦定义,我需要这些宏在整个库中可见.问题是上面的代码只适用于单个文件.
我知道解决此问题的另一种方法是将宏添加到构建命令.这将负责为整个宏定义宏.dll,我将#if - #else在库中的任何地方进行检查.这种方法的问题是我希望能够轻松维护宏.将它们放在项目内的文件中将是完美的.我也想在里面发表一些评论,以便我知道每个宏在做什么.如果我必须将宏作为构建参数传递,这将不适用.另一个原因是能够通过简单地评论和检查行为来打开/关闭宏.
有没有一个体面的方式来实现我的要求?我宁愿不处理任何类似的构建自动化工具MSBuild,NAnt或者类似的东西,如果没有其他方法可行,我会很感激你认为哪个是你认为更好的选择.
您可以使用Project + Properties,Build选项卡,"Conditional compilation symbols"设置为整个项目#define它们.这将<DefineConstants>在项目文件中设置元素.使用msbuild覆盖此属性,方法是给它/ property:DefineConstants ="MYMACRO"命令行选项.
我还建议按照 @Hans Passant 的建议将宏放入项目设置(csproj 文件)中。
如果您需要记录定义,您可以将文档文件添加到解决方案中,解释设置的含义。
如果没有太多变体,您可以为每个变体定义一个新的项目配置。这将允许您为每个变体预先配置必要的 #define 列表,然后只需从工具栏中的配置组合框在它们之间切换即可。如果您想暂时禁用一个选项,您可以复制当前配置并删除#define,然后在测试后删除该配置。
我建议的下一个选项是使用一个简单的文本文件(设置+注释)来配置项目,并花费 15分钟编写一个快速的 C# 应用程序来读取此文件并将其包含的设置写入 .csproj 文件 - 它只是 XML,因此应该是一个简单的应用程序。您可以轻松调整此文件并运行更新程序应用程序来更改项目设置。如果这是您经常做的事情,请花 30 分钟,并添加带有复选框的 UI,以便更轻松地选择设置。
不过,您描述的概念听起来很奇怪。库的要点通常是您拥有一组可以由许多客户端共享的标准化代码,因此我不需要经常更改这些定义来重新配置整个库。 。也许你有充分的理由,但可能值得回顾一下为什么你需要解决这个 #define 问题。
(例如,如果您有很多客户需要“库”的不同变体,那么最好的方法是使用配置(如上所述)来允许您在批量构建中构建所有需要的变体。如果您只是尝试很多不同的算法/技术,那么您是否可以重新设计库的块,以便可以将大多数 #define 的影响限制为单个 .cs 文件,这样它们就不再需要是全局的?也许该库不应该位于需要单个 dll 或插件架构来允许您选择库中包含的“模块”)