【问题标题】:Using C# preprocessor to add reference使用 C# 预处理器添加引用
【发布时间】:2009-08-11 18:45:43
【问题描述】:

我有一个可以通过命令行构建的大型应用程序。我想指定一个标志,使我能够将其编译为两种模式之一,即实际模式或模拟模式。

所以主要问题是,如何使用预处理器以编程方式添加引用?

例如:

#if SIMULATED
    include SimulatedFiles;
    myFactory = new SimulatedFiles.simFactory();
#else
    myFactory = new realFactory();
#endif

我不希望将任何模拟文件编译到我的“实际”应用程序中。由于 C# 中没有“包含”指令,所以我一直在纠结如何实现这一点。

【问题讨论】:

    标签: c# reference c-preprocessor


    【解决方案1】:

    您不能通过 C# 预处理器语句执行此操作,因为该语言不支持通过预处理器宏进行引用的概念。

    您可以做的是使用 msbuild 文件并根据 msbuild 参数更改添加的引用集。

    【讨论】:

      【解决方案2】:

      nant/msbuild 和带有 xml 配置的依赖注入工具?

      【讨论】:

        【解决方案3】:

        在 C# 中,没有真正的预处理器,您可以在 C# Preprocessor's documentation 上阅读。

        来自文档(重点是我的):

        虽然编译器没有单独的预处理器,但本节中描述的指令的处理方式就像有一个一样;这些指令用于帮助条件编译。 与 C 和 C++ 指令不同,您不能使用这些指令创建宏

        【讨论】:

          【解决方案4】:

          包含文件是您自己的源代码,还是第三方程序集 dll?

          如果它们是您自己的来源,那么您可以轻松地使用条件编译从您的发布版本中删除“模拟”代码,就像您在示例中所做的那样(只需将“包含”替换为“使用”)。例如,这是调试类的常见做法。

          如果您不“控制”包含的源代码,那么您仍然可以添加项目引用,但如果您有条件地编译所有使用该程序集的代码,您的应用程序将永远不会尝试访问程序集,因此在代码运行时不需要存在。

          (对您来说似乎不太有用的另一种可能性是编写您发布的引用程序集的“虚拟”版本来代替“真实”程序集,或者在模拟构建中调用真实第三方 dll 的代理仅。如果它提供您调用的公共类和方法,您可以将虚拟程序而不是模拟程序集发送给您的客户)

          【讨论】:

            猜你喜欢
            • 2021-06-02
            • 2011-04-02
            • 2011-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多