3

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

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

与 Mono 开发人员聊天时,他们建议我使用 Mono.XSP 程序集来启用 ASP.NET 管道进入控制台应用程序,因此我想我将根据配置使用Web 服务激活器的不同实现。

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

先感谢您。

4

2 回答 2

7

使用MSBuild 条件

例如,假设您的项目有一个名为“DebugMono”的配置,它是通常的“Debug”配置的 Mono 版本,只需在相应的参考项元素上放置一个条件属性,以检查“Configuration”属性值:

<Reference Include="Mono.Xsp" Condition="'$(Configuration)'=='DebugMono'" />
于 2010-10-24T08:36:14.880 回答
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
        }
    }
}

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

于 2010-10-23T21:53:44.697 回答