在Visual Studio中更改项目引用中的条件编译

6
我是一名有用的助手,可以进行文本翻译。以下是需要翻译的内容:

我有一个类库A,它被我的解决方案中的其他项目B和C使用。

类库A根据预处理器指令的存在表现出不同的行为,例如:

#if some_directive
      // some code
#else
      // some other code
#end

如何在启用了some_directive的项目B中使用类库A,但在禁用了some_directive的项目C中使用?

这三个项目在同一个解决方案中吗? - Steve
@Steve:是的,它们是。 - Naser Asadi
3个回答

1
您可以使用ConditionalAttribute来实现类似以下的操作。 Debug.WriteLine()的存在或不存在取决于"DEBUG"符号的存在与否。
您将能够为自己定义条件符号的名称,以控制代码的存在或缺失。
然后,您可以将该符号放入项目属性"Build"选项卡下的"Conditional compilation symbols"设置列表中,以在需要代码的项目中使用它。
不幸的是,这不能让您拥有"some other code"部分,并且仅适用于整个方法。

是的,但是ConditionalAttribute只适用于定义符号的项目(项目A)。我想在项目B或C中拥有控制权。 - Naser Asadi
@NaserAsadi 在项目B或C中设置的设置影响在项目A中定义的条件代码是否存在调用。这就是您可以使用自己项目中的“DEBUG”符号打开和关闭对Debug.WriteLine()的调用的方法,即使Debug.WriteLine()未在您自己的项目中定义。它实际上所做的只是使其好像如果未定义该符号,则从未调用该方法。我猜这可能不太接近您想要的。 - Matthew Watson
这实际上是一个非常好的答案,解决了OP的问题。不过缺点是"[Conditional]"成员仍会编译到最终程序集中。我个人正在寻找一种方法,根据引用它的其他程序集来进行真正的条件编译。 - Emperor Eto

1

目前似乎不支持这个功能。根据这篇文章所述:

该语言不支持通过预处理器宏引用的概念。 你可以使用msbuild文件并基于msbuild参数更改添加的引用集。

我使用的另一种解决方法是在“配置管理器”中使用解决方案配置。我为构建每个项目B或C创建了两个配置,其中仅在这些配置中的一个中启用了预处理指令。


0

我知道这个话题比较老了,但是对我来说,以下方法非常有效,也可能适用于其他人:欢迎评论此方法的优点和缺点。 如果将你的.cs文件作为现有项目的链接添加到每个项目中,你可以使用不同指令进行编译。 要将现有项目作为链接文件添加,请参见屏幕截图此帖子。 使用文件夹来组织链接文件。

// file ClassA.cs

namespace HelperClasses
{
     public ClassA
    {
    #if some_directive
      // some code
    #else
      // some other code
    #end
    // ....
    }
}

// using statement in Project B and C
using HelperClasses
// Add ClassA.cs in both Projects B and C
// as exiting, linked File -- not as a Reference
// set the compiler-Directives according your needs

这是基于文件的工作方式。如果您有很多文件,您可以创建一个共享项目代码将作为每个引用项目的一部分进行编译,并且可以包含编译器指令。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接