读书人

灾区兄弟的有关问题已解决请各位进来

发布时间: 2012-01-12 22:11:58 作者: rapoo

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

C# code
public class Crypto    {        public string md5(string plaintext)        {            byte[] bt = Encoding.UTF8.GetBytes(plaintext);            MD5CryptoServiceProvider md5obj = new MD5CryptoServiceProvider();            return BitConverter.ToString(md5obj.ComputeHash(bt));        }    }

Utility.dll程序集下还定义了个接口,是所有WINDOWS服务的入口。(我把一个WINDOWS服务编写为一个DLL,逐个反射加载。)
C# code
namespace Utility.Agreement{    public interface IServerPlugin    {        /// <summary>        /// 开启运行        /// </summary>        void Start();    }}


Checker.dll程序集,是服务的逻辑功能,客户端发送GETCONNSTR指令过来,就返回连接字符串。并做其它一些用户验证的功能。
C# code
//注: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了。请教~~~        }


反射创建Checker.dll程序集。
C# code
//这个代码没有问题,做个参考,主要是上面那个代码出了问题。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();


[解决办法]
帮你顶!!
[解决办法]
我也关注一下~~~~~~~~~~~~
[解决办法]
帮你顶!!
[解决办法]
关注~~~~~
[解决办法]
期待孟子先生等大虾们的解答,俺一菜鸟悄悄爬过~~~

读书人网 >C#

热点推荐