技术开发 频道

Mono在Linux上的开发与实践札记

  在.NET中一切正常,但是在Mono on Linux中无法正常解析,经查看微软的源码和Mono源码后,发现他们的对于第三个typeResolver参数的处理策略不同,故而将上述代码改成:

public static Type GetType(string typeFullName)
{
if(string.IsNullOrWhiteSpace(typeFullName))
return null;
return Type.GetType(typeFullName, assemblyName =>
{
Assembly assembly
= ResolveAssembly(assemblyName);

if(assembly == null)
assembly
= LoadAssembly(assemblyName);
return assembly;
}, (assembly, typeName, ignoreCase)
=>
{
if(assembly == null)
return null;
else
return assembly.GetType(typeName, false, ignoreCase);
},
false);
}

  后来发现对解析像 System.Int32 这样的简写类型名失败,原因就在于typeResolver参数对应的委托回调中传入的assembly参数为空(null),故而将其后的代码(黄色高亮)行改为:return Type.GetType(typeName, false, ignoreCase);即可!

  二、在.NET中使用System.Net.HttpListener进行侦听后,如果进程被强制关闭Windows操作系统会回收它所占用的地址和端口(注意:该点未经证实,纯属个人瞎猜),故重新运行该程序后顺利重启HttpListener。但是在Mono on Linux中却行不通,当强制关闭进程后,再次运行会抛出 System.Net.Sockets.SocketException,提示“Address already in use.”这表示Socket已经被占用,需要手动将占用的Socket关闭,那该怎么做呢?首先查出机器中的网络状态,然后找到占用的该Socket的进程,再将该进程Kill掉即可。找到如下操作步骤可解决之:

  在Linux终端中,键入这个命令:lsof –i

  如果当前用户不是root可能什么也看不到,那么请切换到root用户权限,如:sudo lsof -i

  上面命令会提示你输入root根用户的密码,然后即可看到当前机器中的网络占用列表了,这时如果人品没问题的话,应该可以看到cammand为mono的占用记录,如果你清楚自己占用的端口号的话,请这么查看(以88端口为例):lsof –i:88 或者 sudo lsof –i:88

  你找到占用程序的进程Id(PID),然后使用kill命令干掉它即可,假设PID为1234:kill 1234 或者 sudo kill 1234

  好了,再次运行程序,又跑起来了!Good,先到这,还会有很多问题等着我们的,到时再写吧!

0
相关文章