C# 编译器#if指令在Mono和.NET之间拆分

C# 编译器#if指令在Mono和.NET之间拆分,c#,.net,mono,C#,.net,Mono,我需要在Mac上为Mono和PC上的.NET双重编译一个类库。我想做一些小改动,但我希望使用编译器指令拆分代码。有什么建议吗?你当然可以用 #if MONO 然后用 gmcs -define:MONO ... (当然,也可以将其放在Mono构建配置中。这取决于您构建库的方式。) 。。。除此之外,您还需要什么?首选方法是使用运行时检测,因为这允许在任一平台上使用相同的程序集: using System; class Program { static void Main ()

我需要在Mac上为Mono和PC上的.NET双重编译一个类库。我想做一些小改动,但我希望使用编译器指令拆分代码。有什么建议吗?

你当然可以用

#if MONO
然后用

gmcs -define:MONO ...
(当然,也可以将其放在Mono构建配置中。这取决于您构建库的方式。)


。。。除此之外,您还需要什么?

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

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");
    }
}

虽然运行时检查可能更可取,但对于Mono编译器,预定义的
\uuuu monos\uuuu
常量很有用,例如:


只需确保没有开发人员将_u; monos _;添加到您的Visual Studio项目生成属性,然后想知道为什么编译的代码不能按预期工作!:-/这是正确的答案,应该被标记为正确答案。我同意@BSalita的说法,这是正确的答案(而且有效)。在我的特殊情况下,我需要向名称空间添加一个接口。单声道版本还没有。这对我来说正好相反。我使用System.Deployment.Application添加了这个
#if u monos u u u u u u u u u u u ;#endif
——编译完成。而忽略它是失败的。与逻辑上应该发生的完全相反,因为我是在Mac上用Mono编译的。这对我们这些想使用Mono特定功能的人没有帮助。。。
#if __MonoCS__
// Code for Mono C# compiler.
#else
// Code for Microsoft C# compiler.
#endif