我正在开发一个开源项目(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,编译器将正确使用该引用。
提前谢谢。
答案 0 :(得分:7)
例如,假设您的项目具有名为“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
}
}
}
然后,您可以在修复错误后替换此类实现。