Visual Studio C#项目:如何在.csproj中放置条件引用?

时间:2010-10-23 21:38:12

标签: c# asp.net visual-studio mono conditional-compilation

我正在开发一个开源项目(Logbus-ng),我需要以一种在Windows和Mono上 的方式实现由控制台应用程序生成的Web服务。 / p>

目前,感谢MSDN杂志的tutorial,我成功地在Windows上做到了这一点。控制台应用程序可以生成自己的Web服务器,并实际打开外部的Web服务接口。问题是,这在Mono中不起作用,合理的原因是Mono bug。

与Mono开发人员聊天,他们建议我使用Mono.XSP程序集将ASP.NET管道启用到控制台应用程序中,所以我想我会根据配置使用web service activator的不同实现。

现在我的问题是:因为Mono.XSP在所有Mono发行版中都可用于GAC(即在Linux下使用xbuild时)但在Windows中不可用,除非有人将其安装到GAC中,并且我不希望使用我的软件发送Mono.XSP,如果他们不需要它就强迫某人安装Mono(即如果在Windows下编译),我可以设置一个引用GAC中的Mono.XSP程序集仅在启用MONO编译标志时启用?启用此标志后,我的代码显然将引用Mono.XSP而不是上面链接的教程中介绍的HttpListenLibrary,编译器将正确使用该引用。

提前谢谢。

2 个答案:

答案 0 :(得分:7)

使用MSBuild condition

例如,假设您的项目具有名为“DebugMono”的配置,这是通常的“Debug”配置的Mono版本,只需将条件属性放在检查“Configuration”属性值的相应引用项元素上:

<Reference Include="Mono.Xsp" Condition="'$(Configuration)'=='DebugMono'" />

答案 1 :(得分:2)

我不知道这是否可以实现。但您可以考虑使用反射来延迟绑定程序集,获取所需对象和方法的实例。这让你知道你会这样做:

// Wrapper class:
public class Listener
{
    public void Start()
    {
        bool useMono = true; // TODO: Get this from config
        if (!useMono)
        {
            // Bind directly to this as it will be available in Mono too
            HttpListener listener = new HttpListener();
            listener.Prefixes.Add("http://localhost:8081/foo/");
            listener.Prefixes.Add("http://127.0.0.1:8081/foo/");
            listener.Start();
        }
        else
        {
            Assembly asm = Assembly.Load("TheNameOfTheAssembly");

            Type type = asm.GetTypes().Where(x => x.Name == "TheType").FirstOrDefault();
            object obj = Activator.CreateInstance(type);
            MethodInfo mi = type.GetMethod("NameOfMethod");
            mi.Invoke(obj, null); // invoke with list of parameters
        }
    }
}

然后,您可以在修复错误后替换此类实现。