首页 新闻 会员 周边 捐助

求高手帮忙看代码(remoting、windows服务、反射运用)

0
悬赏园豆:100 [已关闭问题] 关闭于 2010-11-08 10:10

最近学remoting开发,宿主为windows服务,代码写好测试时就是启动不了windows服务,手动启动马上又停止了,我知道写的代码有问题。于是改为控制台应用程序,这样的话服务端运行没有错误,但是客户端ITest  iTest  = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8999/Tst"));
Response.Write(iTest.Hello());运行到这句提示错误:找不到请求的服务。请高手帮忙看下代码!

 

我将创建appdomain和assembly放在AssemblyLoader类库里,下面是代码AppDomainLoader类:

public void CreateAppDomain(string dllName)
        {
            domains = new Hashtable();
            AppDomainSetup setup = new AppDomainSetup();
            setup.ShadowCopyFiles = "true";
            domain = AppDomain.CreateDomain(dllName, null, setup);

            domains.Add(dllName, domain);
            object[] parms = { dllName };
            BindingFlags bindings = BindingFlags.CreateInstance |
                BindingFlags.Instance | BindingFlags.Public;
            try
            {
                _remoteLoader = (RemoteLoader)domain.CreateInstanceFromAndUnwrap(
                    "Explorer.Framework.AssemblyLoader.dll", "Explorer.Framework.AssemblyLoader.RemoteLoader", true, bindings,
                    null, parms, null, null, null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void LoadAssembly(string dllUrl)
        {
            CreateAppDomain(dllUrl);
            _remoteLoader = new RemoteLoader();
            _remoteLoader.LoadAssembly(dllUrl);
        }

 

 

RemoteLoader类:

 public class RemoteLoader : MarshalByRefObject, IDisposable
    {
        private Assembly _assembly;

public RemoteLoader()
        {

        }
        public RemoteLoader(string dllUrl)
        {
            if (null == _assembly)
            {
                _assembly = Assembly.LoadFile(dllUrl);
            }
        }

        public void LoadAssembly(string dllurl)
        {

            _assembly = Assembly.LoadFile(dllurl);
            Type[] type = _assembly.GetTypes();
            foreach (Type t1 in type)
            {
                string name = t1.Name;
                RemotingConfiguration.RegisterWellKnownServiceType(t1,name, WellKnownObjectMode.SingleCall);
                LifetimeServices.LeaseTime = TimeSpan.Zero;


            }

        }

}

 

service服务端代码:

 

 private void RemoteStart()
        {
            _remoteManager = new RemoteManager.RemoteManager();
            DataTable dt = _remoteManager.GetAssemblyList();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if ("Remoting" == dt.Rows[i]["Mode"].ToString())
                {
                    BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
                    BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
                    serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

                    int port = int.Parse(dt.Rows[i]["Port"].ToString());
                    TcpChannel tc = new TcpChannel(port);
                    ChannelServices.RegisterChannel(tc, false);
                    _appDomainLoader = new AppDomainLoader();
                    DataTable dTable = _remoteManager.RemoteList();
                    for (int j = 0; j < dTable.Rows.Count; j++)
                    {
                        string url = dTable.Rows[j]["Key"].ToString();
                        _appDomainLoader.LoadAssembly(url);
                    }

                }
            }

        }

 

请高手帮忙找出错误所在,小弟刚学着三个技术,花了两三天也没找出问题,弄得头大死了。

问题补充: 我在用appdomain时,用 Test test = (Test)appDomain.CreateInstanceAndUnwrap(aname, "Explorer.Framework.Service.Test");创建实例后,在客户端 iTest = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8989/test")); 报错“找不到请求的服务”, 我把appdomain创建实例的这句拿掉,直接用assembly的话程序就正确了,求高手指点啊 AppDomainLoader.cs创建AppDomain和卸载,RemoteLoader.cs创建assembly。我把windows服务启动后,在客户端也就是web页面上调用Test.Test test = (Test.Test)(Activator.GetObject(typeof(Test.Test), "tcp://localhost:8989/Test"));Response.Write(test.GetType().ToString());没有错误,输出的是System.MarshalByRefObject 。如果Response.Write(test.Hello())也就是我调用Test.dll里面的方法的话,就出现错误了,错误为:找不到服务的请求。 假如我不创建AppDomain,直接Assembly的话,可以调用Test.dll的方法,输出正确。
萧鼎的主页 萧鼎 | 初学一级 | 园豆:106
提问于:2010-11-03 14:44
< >
分享
所有回答(2)
0

你看下  

TcpChannel tc = new TcpChannel(port);
ChannelServices.RegisterChannel(tc, false);

是否注册成功。

Launcher | 园豆:45050 (高人七级) | 2010-11-03 14:59
怎样调试?我把代码放到控制台应用程序里,一路运行下来都没有错,怎样查看是否注册成功?
支持(0) 反对(0) 萧鼎 | 园豆:106 (初学一级) | 2010-11-03 15:03
0
  1. 安装您的服务。
  2. 可从服务控制管理器、“服务器资源管理器”或代码启动服务。
  3. 在 Visual Studio 中,从“调试”菜单中选择“进程”。 出现“进程”对话框。
  4. 单击“显示系统进程”。
  5. 在“可用进程”区域内单击服务的进程,然后单击“附加”。 (提示   此进程将与服务的可执行文件同名。)出现“附加到进程”对话框。
  6. 选择任意适当选项,然后单击“确定”关闭对话框。 (注意   您现在已处于调试模式。)
  7. 设置要在代码中使用的任意断点。
  8. 访问服务控制管理器并操纵您的服务,并发送停止、暂停和继续命令以命中您的断点。

可以试着调试下

雪莱·亨尼格 | 园豆:524 (小虾三级) | 2010-11-04 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册