灾区兄弟的问题已解决,请各位进来分析下原因……关于反射,WINDOWS服务,TCP端口监听服务,顶者散分。
我的目的是要实现一个WINDOWS服务,开启一个端口,接受客户端指令,返回特定的字符串。
涉及到程序简化如下。
Utility.dll程序集下面有个MD5加密类
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();