在.NET中一切正常,但是在Mono on Linux中无法正常解析,经查看微软的源码和Mono源码后,发现他们的对于第三个typeResolver参数的处理策略不同,故而将上述代码改成:
publicstaticType GetType(string typeFullName)
{if(string.IsNullOrWhiteSpace(typeFullName))returnnull;returnType.GetType(typeFullName, assemblyName=>{
Assembly assembly=ResolveAssembly(assemblyName);if(assembly==null)
assembly=LoadAssembly(assemblyName);returnassembly;
}, (assembly, typeName, ignoreCase)=>{if(assembly==null)returnnull;elsereturnassembly.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,先到这,还会有很多问题等着我们的,到时再写吧!