C# 中有没有一种简单的方法可以根据操作系统版本获得条件编译符号

发布于 2024-09-01 03:11:45 字数 162 浏览 6 评论 0原文

我有一堆单元测试需要根据 Windows 操作系统版本进行条件编译。 此单元测试正在测试仅在 Windows Vista 及更高版本中可用的 TxF。

#if WIN_OS_VERSION >= 6.0
// Run unit tests
#endif

I have a bunch of unit tests that need to be conditional compiled based on Windows OS version.
This unit tests are testing TxF that is only available in Windows Vista and above.

#if WIN_OS_VERSION >= 6.0
// Run unit tests
#endif

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

来世叙缘 2024-09-08 03:11:45

我认为没有办法根据操作系统版本有条件地编译代码。 #define 的文档指出(重点是我的):

可以用符号来指定
编译条件。你可以
使用#if 或#elif 测试符号。
您还可以使用条件属性来执行条件编译。

您可以定义符号,但不能为符号赋值。 #define
在使用任何指令之前,指令必须出现在文件中
这也不是指令。

您还可以使用 /define 编译器选项定义符号。你可以
使用#undef 取消定义符号。

使用 /define 定义的符号
或与 #define 不冲突
同名的变量。那是,
不应传递变量名
到一个预处理器指令和一个
符号只能由
预处理器指令。

使用#define创建的符号的范围是定义它的文件。

您必须有条件地运行它:

void TestTxF() {
    if (System.Environment.OSVersion.Version.Major < 6) {
        // "pass" your test
    }
    else {
        // run it
    }
}

更新: >

之前已经提出过这个问题。

I don't think there's a way to conditionally compile code based on OS version. The documentation for #define states (emphasis mine):

Symbols can be used to specify
conditions for compilation. You can
test for the symbol with either #if or #elif.
You can also use the conditional attribute to perform conditional compilation.

You can define a symbol, but you cannot assign a value to a symbol. The #define
directive must appear in the file before you use any instructions
that are not also directives.

You can also define a symbol with the /define compiler option. You can
undefine a symbol with #undef.

A symbol that you define with /define
or with #define does not conflict with
a variable of the same name. That is,
a variable name should not be passed
to a preprocessor directive and a
symbol can only be evaluated by a
preprocessor directive.

The scope of a symbol created by using #define is the file in which it was defined.

You will have to conditionally run it instead:

void TestTxF() {
    if (System.Environment.OSVersion.Version.Major < 6) {
        // "pass" your test
    }
    else {
        // run it
    }
}

Update:

This has been asked before.

半山落雨半山空 2024-09-08 03:11:45

您可以自己简单地管理调试符号。

只需提出一个您可以坚持的模式(记录它!),然后当您为新平台进行编译时,只需记住更改处理器指令即可。

例如,您可以有符号

LATER_THAN_XP
LATER_THAN_VISTA
etc...

然后您可以使用#ifdef进行条件编译

#ifdef LATER_THAN_XP

//Run Unit Tests

#endif

然后您可以在项目属性中定义这些常量。或者,如果您喜欢冒险,您可能可以定义一个 MSBuild 任务,导出正确的符号以在编译时定义,但这比我的工资等级稍高一些。

You can simply manage the debug symbols yourself.

just come up with a schema that you can stick to (Document It!) and then when you compile for a new platform just remember to change the processor directives.

for example you could have symbols

LATER_THAN_XP
LATER_THAN_VISTA
etc...

Then you can use #ifdef's to conditionally compile

#ifdef LATER_THAN_XP

//Run Unit Tests

#endif

Then you can just define these constants in your project properties. Or if you are feeling adventurous you could probably define an MSBuild Task that exports the correct symbol(s) to define at compilation time, but thats a litle above my pay grade.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文