日期:2014-05-18  浏览次数:20820 次

灾区兄弟的问题已解决,请各位进来分析下原因……关于反射,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();



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