#if DEBUG 指令在编译的类库中

Posted

技术标签:

【中文标题】#if DEBUG 指令在编译的类库中【英文标题】:#if DEBUG directive in compiled class library 【发布时间】:2016-10-29 14:30:00 【问题描述】:

我将在类库中使用#if DEBUG 指令。编译后的 ClassLibrary.dll 将在单独的 Application.exe 中使用。

这个类库中的调试代码会在以下情况下执行吗?

    库以 DEBUG 模式编译,应用程序以 RELEASE 编译 库在 RELEASE 中编译,应用程序在 DEBUG 中编译

【问题讨论】:

只需将其可视化,因为编译库时生成的代码是将链接到应用程序的代码。尽管我认为出于多种原因,我可能不会将调试和发布版本链接在一起。这个答案中有一些信息:***.com/questions/11658915/… 【参考方案1】:

编译器指令在编译时解释,而不是在运行时解释。因此,使用的应用程序是在 RELEASE 还是 DEBUG 模式下编译都没有关系。因此

1.) 库在 DEBUG 模式下编译,应用程序在 RELEASE 下编译 => Yes

2.) 库在 RELEASE 中编译,应用程序在 DEBUG 中编译 =>

【讨论】:

【参考方案2】:

我遇到了类似的问题,尽管我在调试预处理器指令中配置了调试模式设置,但发布模式仍在使用调试模式设置。原来问题在于如何将类库项目的引用 dll 添加到我的项目中。有两种方法可以添加对项目的引用。

选项 1: 将项目的调试/发布文件夹中的 .dll 添加到 依赖它的项目。 问题:这引入了一个问题,如果您添加了对 dll 的调试版本,即使您在发行版中运行应用程序 模式,它仍然会引用调试版本。修复:您必须替换与您要运行的模式相对应的 .dll 例如:如果您要在发布模式下运行,您将拥有 将依赖 dll 替换为其对应的发布版本。

选项 2: 添加您要引用的项目的项目引用 (.csproj) 文件。优势: 这样可以确保整个解决方案何时 内置发布模式,它正确解析所有依赖项 发布模式,当您在调试中构建解决方案时,它会得到所有 调试模式下的依赖项目。这不需要你的 干预。

选项 1 有什么用处? -> 当您的项目想要的项目时 参考不存在于与您相同的解决方案中。想想 您想使用 3rd 方 dll 的场景。在这种情况下,您 要么没有第 3 方代码,但只有 dll,要么就是谎言 在不同的解决方案中。

option2 什么时候有用? -> 当两者都用 引用项目和被引用项目存在于同一个解决方案中 (这是我的场景)。如果你还记得,我所有的项目都存在于 相同的解决方案。

说明如何以 2 种方式添加项目引用的链接: https://www.c-sharpcorner.com/article/project-reference-vs-dll-reference-in-visual-studio/

【讨论】:

这是一个非常有用的答案:我在同一个解决方案中有一个 MVC 应用程序和一个类库。最初我在 MVC 应用程序中添加了对指向 ../debug/library.dll 的类库的引用。所以当我发布我的项目时,它总是使用调试版本。所以我删除了引用并添加了一个项目引用。 VS 现在会自动进行正确的配置。

以上是关于#if DEBUG 指令在编译的类库中的主要内容,如果未能解决你的问题,请参考以下文章

vue中指令的实现原理

单片机中指令CLR是啥意思

jsp元素

Java中指令重排

实模式与保护模式详解三:寻址方式

debug类和trace类的区别