Visual Studio 2010 Express忽略了C#预处理指令?

4

我有一段代码从 codeProject 下载。

#if 预处理器指令似乎不像我期望的那样工作。

在下面的代码中,当项目构建时显示错误消息 DShowNET could not be found。由于 DSHOWNET 从未被定义,我很惊讶 'using DShowNET' 甚至被处理了。

我没有在 MyProject >> Properties >> Build Tab >> Conditional compilation symbols 中定义 DSHOWNET(对话框为空)。

using System;
using System.Collections;
using System.Runtime.InteropServices;
#if DSHOWNET
using DShowNET;
using DShowNET.Device;
#else
#if VS2003
#else
using System.Runtime.InteropServices.ComTypes;
#endif
using DirectShowLib;
#endif

#if 预处理指令在 Visual Studio Express 版本中是否有效?DSHOWNET 是否需要显式“未定义”?还是我遗漏了其他基本概念?


3
请查看 #if DSHOWNET 语句内的代码 - 它是否呈灰色状态或保留了原有的语法高亮? - slugster
@slugster,语法高亮显示表明 else 后的语句被忽略了。shelleybutterfly 下载了代码,并发现 DSHOWNET 在解决方案中的另一个项目中已定义。感谢关于语法高亮的提示,这将在未来很有用。 - DarwinIcesurfer
1个回答

5
我下载了示例采集器项目并将其放在我的系统上。(我正在使用企业版VS。)我打开了CaptureTest-2005解决方案,将其转换为VS2010解决方案并加载它。加载CaptureTest-2005解决方案时,我仍然看到有与您看到的问题相同的文件。
所以,我的结论是,尽管CaptureTest-2005项目在构建页面上没有定义DSHOWNET,但DirectX.Capture-2005项目却定义了。因此,在DirectX.Capture-2005中的所有文件中,DSHOWNET指令都会被评估为true,因此在#if DSHOWNET指令内部处理了这些项。
我不确定解决方案是否只需要构建和使用CodeProject下载的DSHOWNET部分(例如,我不确定是否需要DirectX.Capture),但我想象一下,由于DirectX.Capture项目已经定义了它,你将不得不构建和使用那个程序集来运行该项目。(也许有一种方法可以避免这个问题,但我没有深入研究。我建议查看项目页面,看看关于什么依赖于什么的信息。)
希望这能帮助到你!

非常感谢您如此彻底地深入研究这个问题! - DarwinIcesurfer
微软在Visual Studio Express版本中做了一些“有趣”的事情。在IDE的项目属性的构建选项卡中,条件编译符号是空白的。但是,如果你用Notepad++打开.csproj文件,你会发现有一个XML行<DefineConstants>DEBUG;TRACE;VS2003;DSHOWNET</DefineConstants>定义了常量! - DarwinIcesurfer
如果您认为这很有趣,您可以在http://connect.microsoft.com/VisualStudio上提交一个错误报告。我找不到与此相关的错误报告,因此可能是特定的.csproj文件的问题。 - shelleybutterfly

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