【发布时间】:2012-02-21 15:08:16
【问题描述】:
在 C# 中,您可以使用类似于 C/C++ 语法的宏进行条件编译。这将使以下情况发生:
#define MYMACRO
....
#if MYMACRO
//some C# code logic
#else
//some other C# code logic
我需要在 C# 库项目的专用文件中定义一些宏,并且一旦定义,我需要这些宏在整个库中可见。问题是上面的代码只适用于单个文件。
我知道解决此问题的另一种方法是将宏添加到构建命令中。这将负责为整个.dll 定义宏,并且我将使#if - #else 检查在库中我想要的任何位置工作。这种方法的问题是我希望能够轻松地维护宏。将它们放在项目内的文件中将是完美的。我也想在里面放一些 cmets,这样我就会知道每个宏在做什么。如果我必须将宏作为构建参数传递,这将不适用。另一个原因是能够通过简单地评论和检查行为来打开/关闭宏。
有没有一种体面的方法来满足我的要求?我不想处理任何构建自动化工具,例如MSBuild、NAnt 或类似的东西,如果没有其他方法,我会很感激您认为哪个是更好的选择。
【问题讨论】:
-
您可以将定义添加到 csproj 文件中......
-
你的意思是,作为构建参数?如果这是您的想法,我已经提到我现在对这种方法不满意。如果没有,我会很高兴你能分享更多关于如何做到这一点的信息。谢谢
-
在这种情况下,我认为在不同的类中有不同的实现并基于配置文件(使用 IoC 容器)注入它们会更好,这对于不同的环境可能会有所不同。并且在应用程序启动时进行一次运行时检查不会影响性能。
-
@svick,这是一个很好的解决方案,但我担心在我的情况下这是我想避免的。 DI 意味着库的使用者应该了解环境依赖关系并且应该注意正确的注入——这使得库不是一个独立的库并且具有更严格的要求。我追求的主要目的之一是使消费者代码不复杂,或不依赖于这些“内部”考虑因素。
-
你可以使用Poor Man's DI,或者编译一个轻量级容器作为你项目的一部分。 Here's one example. 这不是我的首选解决方案,但它是一种选择。
标签: c# .net c-preprocessor