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

3
我正在开发一个开源项目(Logbus-ng),需要在控制台应用程序中实现一个Web服务,以使其能够在Windows和Mono上正常工作。
目前,感谢MSDN杂志的tutorial,我已经成功地在Windows上完成了这项任务。控制台应用程序可以生成自己的Web服务器,并实际上向外部打开Web服务接口。问题是,在Mono上无法正常工作,这可能是由于Mono的一个错误导致的。
与Mono开发人员聊天后,他们建议我使用Mono.XSP程序集将ASP.NET管道引入控制台应用程序,因此我认为我将根据配置使用不同的web服务激活器实现此功能。
现在我的问题是:由于Mono.XSP在所有Mono发行版中都可以在GAC中使用(即在Linux下使用xbuild时),但在Windows下除非有人将其安装到GAC中,否则不可用。我不想随软件一起发布Mono.XSP,也不想强制某人安装Mono(例如在Windows下编译时)如果他们不需要它,那么我能否设置对GAC中的Mono.XSP程序集的引用,只有在启用MONO编译标志时才启用?当启用此标志时,我的代码显然将引用Mono.XSP而不是上面链接的教程中涵盖的HttpListenLibrary,并且编译器将正确使用该引用。
2个回答

7
使用MSBuild条件。例如,假设您的项目有一个名为“DebugMono”的配置,这是通常的“Debug”配置的Mono版本,只需在相应的引用项元素上放置一个条件属性,检查“Configuration”属性值即可:
<Reference Include="Mono.Xsp" Condition="'$(Configuration)'=='DebugMono'" />

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
        }
    }
}

当缺陷得到修复后,您可以替换此类实现。


好的... 我可能是指#if MONO而不是if(useMono) :) 但这可以是一个想法。你做得很好。 - usr-local-ΕΨΗΕΛΩΝ
是的,如果您不介意制作不同的构建版本。这样可以让您只有一个构建版本,但设置程序必须为Mono提供特定的配置。 - steinar
我目前使用不同的构建版本,因为其他Mono问题,所以对我来说没问题。 - usr-local-ΕΨΗΕΛΩΝ

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