首页 新闻 会员 周边 捐助

remoting读取不是debug下的dll文件

0
悬赏园豆:10 [已解决问题] 解决于 2010-11-11 13:58

我要加载不存放在bin的debug下的dll,如何加载。

我已尝试用loadfrom、loadfile来加载,假如我的debug下面有Test.dll文件的话,然后我调用其他文件夹比如F:\dll下面的这个Test.dll,使用路径F:\dll\Test.dll调用两个方法都能正确加载,客户端能调用Test.dll里面的方法。但是我把debug下面的这个Test.dll删除掉,再用路径F:\dll\Test.dll来加载:

未能加载文件或程序集“Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。

在程序运行的 时候,我尝试删除F:\dll下面的Test.dll,结果不能删除,说明服务端的程序已经在使用这个dll,但是客户端却提示找不到文件,我猜是不是我的Test.dll这个dll的接口问题,我在客户端引用接口,然后实现代理,iTest = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8887/Test"));再调用方法时,提示找不到文件。

问题补充: 我上传的dll设想是放在dll文件夹下面的一个按时间版本创建的文件夹里面的,然后在windows service里每个dll文件都AppDomain一个程序域,在这个域里面动态,TcpChannel这个dll,在客户端调用它的接口,使用时,用Activator.GetObject生成代理,调用dll的方法。如果是全部dll都放到bin下的话,就有一个问题,同一个dll的不同版本会覆盖掉,而我要的是用新创建的文件夹来体现版本号,并根据xml里面保存的信息动态加载dll。 现在的问题是,假如我将dll放到我新创建的文件夹里面,windows service启动没问题,测试显示这个文件夹里的dll正被使用中,但是我在客户端已他的接口生成代理:object iTest = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8887/Test"));调用方法提示找不到文件。好像是我把接口给用错了,客户端接收不到,就是不知道怎么用。
萧鼎的主页 萧鼎 | 初学一级 | 园豆:106
提问于:2010-11-08 10:23
< >
分享
最佳答案
0

你的读取是指设么?.要使用这个dll吗?

使用dll应该是用反射来得到这个dll的实体对象: Assembly.LoadFrom(filePath);

详细使用参考http://blog.csdn.net/wormwormwormworm/archive/2008/03/06/2154006.aspx

收获园豆:10
邢少 | 专家六级 |园豆:10926 | 2010-11-08 10:48
读取是指在服务端使用assembly,客户端Activator.GetObject该类的接口,然后使用类里的方法。问题是如果我的debug下面没有这个Test.dll文件的话,在服务端我使用assembly.loadfile或assembly.loadfrom方法,客户端调用的时候都提示找不到Test。但是我将Test.dll复制到debug,就没有了这个错误。
萧鼎 | 园豆:106 (初学一级) | 2010-11-08 14:02
@萧鼎: 仔细看了一下你的题目。我理解题目有点问题。你可以注意你的路径问题,是否你连接的路径有问题?或者贴出你的连接的代码。
邢少 | 园豆:10926 (专家六级) | 2010-11-08 14:53
服务端: TcpChannel tc = new TcpChannel(8999); ChannelServices.RegisterChannel(tc,false); Assembly _assembly = Assembly.LoadFile(@“F:\Work\Code\11.8\Explorer.Framework_10\Explorer.Framework.WindowsService\bin\Debug\dll\2010-11-8\Test.dll”); Type[] t = _assembly.GetExportedTypes(); foreach (Type type in t) { RemotingConfiguration.RegisterWellKnownServiceType(type, type.Name, WellKnownObjectMode.SingleCall); } 客户端: iTest = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8999/Test")); 我要实现的是动态上传dll文件,dll文件的存放路径是debug文件夹下根据日期新创建的文件夹里,存放信息放到xml里。在服务端遍历xml,loadfrom xml里的全部dll,客户端调用dll方法,现在的问题是我loadfrom日期文件夹里的dll,客户端提示找不到Test。我将dll文件放到debug下程序就没错。是不是loadfrom方法只能找到工作目录下的dll文件?我要放到自己建的文件夹里面,该怎样loadfrom?
萧鼎 | 园豆:106 (初学一级) | 2010-11-08 15:18
就是Test.dll的存放路径是F:\Work\Code\11.8\Explorer.Framework_10\Explorer.Framework.WindowsService\bin\Debug\dll\2010-11-8,而不是F:\Work\Code\11.8\Explorer.Framework_10\Explorer.Framework.WindowsService\bin\Debug。我在服务端的Assembly _assembly = Assembly.LoadFile()该怎样写,我用loadfile、loadfrom都不行啊,load就不用说了
萧鼎 | 园豆:106 (初学一级) | 2010-11-08 15:26
@萧鼎:应该是没有问题,用相对路径试试。
邢少 | 园豆:10926 (专家六级) | 2010-11-08 16:12
相对路径不行啊,直接windows服务都启动不了,服务端就出错了
萧鼎 | 园豆:106 (初学一级) | 2010-11-08 16:23
我测试过,在其他地方建文件夹,然后laodfrom该文件夹里面的dll,在服务端启动的时候没有错误,而我将这个文件夹下的dll删除后,服务端就启动不了。上面的情况是不是我客户端的代码写错了,iTest = (ITest)(Activator.GetObject(typeof(ITest), "tcp://localhost:8999/Test")); 不过好像网上都是这样写的啊?
萧鼎 | 园豆:106 (初学一级) | 2010-11-09 09:10
其他回答(2)
0

调试状态默认读取的都是debug下的文件

茂茂 | 园豆:2902 (老鸟四级) | 2010-11-08 12:24
调试状态默认读取的都是debug下的文件 什么意思?放到正式坏境上就可以用了?
支持(0) 反对(0) 萧鼎 | 园豆:106 (初学一级) | 2010-11-08 13:57
0

你在项目里面单独建立个文件夹,用来存放 需要引用的 DLL。加载的时候也从这里加载, 就不会有你上面的问题。

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-11-08 15:29
不行,不管我将dll文件夹建在哪里,如果debug里面没有客户端要调用的dll文件的话,运行都会提示: 能加载文件或程序集“Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
支持(0) 反对(0) 萧鼎 | 园豆:106 (初学一级) | 2010-11-08 15:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册