我的目的是要实现一个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));
}
}Utility.dll程序集下还定义了个接口,是所有WINDOWS服务的入口。(我把一个WINDOWS服务编写为一个DLL,逐个反射加载。)namespace Utility.Agreement
{
public interface IServerPlugin
{
/// <summary>
/// 开启运行
/// </summary>
void Start();
}
}
Checker.dll程序集,是服务的逻辑功能,客户端发送GETCONNSTR指令过来,就返回连接字符串。并做其它一些用户验证的功能。//注: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程序集。//这个代码没有问题,做个参考,主要是上面那个代码出了问题。
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();
涉及到程序简化如下。
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));
}
}Utility.dll程序集下还定义了个接口,是所有WINDOWS服务的入口。(我把一个WINDOWS服务编写为一个DLL,逐个反射加载。)namespace Utility.Agreement
{
public interface IServerPlugin
{
/// <summary>
/// 开启运行
/// </summary>
void Start();
}
}
Checker.dll程序集,是服务的逻辑功能,客户端发送GETCONNSTR指令过来,就返回连接字符串。并做其它一些用户验证的功能。//注: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程序集。//这个代码没有问题,做个参考,主要是上面那个代码出了问题。
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();
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货