日期:2014-05-18 浏览次数:20820 次
public class Crypto { public string md5(string plaintext) { byte[] bt = Encoding.UTF8.GetBytes(plaintext); MD5CryptoServiceProvider md5obj = new MD5CryptoServiceProvider(); return BitConverter.ToString(md5obj.ComputeHash(bt)); } }
namespace Utility.Agreement { public interface IServerPlugin { /// <summary> /// 开启运行 /// </summary> void Start(); } }
//注:Checker.dll这个程序集是被WINFORM或是WINDOWS服务反射创建实例来运行的。 using Utility; using Utility.Agreement; public class SrvMain : IServerPlugin { TcpListener listener;//监听器,当退出时,关闭。 object syncObj = new object(); public bool isCheckerRunning = false; public bool isCloseByCaller = false; Thread thdDaemon; #region IServerPlugin 成员 public void Start() { thdDaemon = new Thread(new ThreadStart(DoServer)); thdDaemon.IsBackground = true; thdDaemon.Name = "thdDaemon"; thdDaemon.Start(); } #endregion } void DoServer() {//这个函数只留关键代码,方便各位阅读。 while (isCheckerRunning) { try { Socket s = listener.AcceptSocket(); new Thread(new ParameterizedThreadStart(CommandServer)).Start(s); } catch (Exception ex) { Log(DateTime.Now.ToString() + " 发生错误。\r\n" + ex.ToString() + "\r\n"); } } } void CommandServer(object data) {//这个函数就主要是逻辑处理的,接受客户端指令,并返回特定字符串。 //...这里是其它一些处理代码 Crypto crypto = new Crypto(); password = crypto.md5(password); //关键就是以上两行,Crypto是在Utility中申明的,当存在以上两行时 //在WINFORM里面反射创建实例是可以的, //但是在WINDOWS服务里面反射创建,可以运行,但是一到CommandServer里面,任何语句都不能执行 //且WINDOWS服务也自动停止了。 //!!!!问题来了:为什么在WINDOWS服务里面反射创建,并运行时会出现这样错误? //我把Crypto那段用MD5CryptoServiceProvider来代替实现MD5加密,就OK了。请教~~~ }
//这个代码没有问题,做个参考,主要是上面那个代码出了问题。 FileInfo fi = new FileInfo(Assembly.GetExecutingAssembly().Location); string FilePath = Path.Combine(fi.DirectoryName, @"plugin\Checker.dll"); Utility.Agreement.IServerPlugin plg = (Utility.Agreement.IServerPlugin)Assembly.LoadFile(FilePath).CreateInstance("Checker.SrvMain"); MWplg.Start();