编译器#if指令用于区分Mono和.NET。

13

我需要在Mac上为Mono和在PC上为.NET双重编译一个类库。虽然我希望能够使用编译器指令来拆分代码,但还有一些小的修改需要进行。您有什么建议吗?

3个回答

45

尽管运行时检查可能更可取,但使用Mono编译器预定义的__MonoCS__常量很有用,例如:

#if __MonoCS__
// Code for Mono C# compiler.
#else
// Code for Microsoft C# compiler.
#endif

1
请确保开发人员不要将__MonoCS__添加到您的Visual Studio项目构建属性中,然后惊讶地发现编译后的代码无法按预期工作!:-/ - Stewart
7
这是正确答案,应该标记为正确。 - BSalita
我同意@BSalita的观点,这是正确的答案(而且它有效)。在我的特定情况下,我需要向命名空间添加一个接口。Mono版本尚未拥有它。 - Nelson Rodriguez
这对我来说完全相反。我添加了这个 #if __MonoCS__ using System.Deployment.Application; #endif - 然后它就编译通过了。而如果不加,就会失败。这与逻辑上应该发生的相反,因为我是在 Mac 上使用 Mono 进行编译。 - PandaWood

19

首选方法是使用运行时检测,因为这样可以在任何平台上使用相同的程序集:

using System;

class Program {
    static void Main ()
    {
        Type t = Type.GetType ("Mono.Runtime");
        if (t != null)
             Console.WriteLine ("You are running with the Mono VM");
        else
             Console.WriteLine ("You are running something else");
    }
}

1
无法帮助那些想要使用Mono特定功能的人... - BlueRaja - Danny Pflughoeft

14

嗯,你肯定可以使用

#if MONO

然后使用编译器进行编译

gmcs -define:MONO ...

(或者当然可以将其放在你的Mono构建配置中。这确实取决于你如何构建你的库。)

... 除此之外,你还想要什么?


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