在远程处理中使用回调

史密斯

新成员
已加入
2014年3月28日
留言内容
1
编程经验
3-5
大家好,
我想在远程模式下使用具有回调的函数。
1)我有一个共享的类库,其中包含一个包含回调的函数
2)服务器作为独立应用程序,用于从共享类库中进行会话
3)客户端作为独立应用程序,它从serer获取会话,然后在其上调用函数
我的代码摘要是:
共享库:
命名空间TestClassLibrary
{
公共类Class1:MarshalByRefObject
{
公共委托void NotifyCallback(string s);
公共无效SelectWithClassDialog(字符串消息,NotifyCallback回调,字符串标题)
{
Console.WriteLine("SelectWithClassDialog");
Console.WriteLine(msg);
Console.WriteLine(title);
如果(回调!= 空值)
s_notify(回调);
}
}
public class 测试会议 : MarshalByRefObject
{
internal 测试会议()
{
}
新的内部void initialize()
{
_cls1 =新的Class1();
}
私人Class1 _cls1;
公共Class1 Class1
{
得到
{
返回_cls1;
}
}
static private 测试会议 theSession;
public static 测试会议 GetSession()
{
锁(typeof(TestSession))
{
如果(theSession == 空值)
{
theSession = new 测试会议();
theSession.initialize();
}
}
返回会话;
}
} ServerCode:
命名空间TestServer
{
TestServer类
{
静态void Main()
{
线程serverThread = new Thread(new ThreadStart(Run));
serverThread.Start();
}
公共静态无效Run()
{
int 港口 = 1234;
测试会议 theSession = 测试会议.GetSession();
LifetimeServices.LeaseTime = System.TimeSpan.FromDays(10000);

//创建一个自定义FormatterSinkProvider,以便我们可以设置其安全性类型
//过滤为完整。这对于反序列化ObjectRef是必需的
SoapServerFormatterSinkProvider provider =新的SoapServerFormatterSinkProvider();
provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

//创建IDictionary以设置通道实例上的端口。
IDictionary道具= new Hashtable();
道具["port"] = 港口;

//使用给定的提供程序和属性创建一个新的HTTP通道
HttpChannel channel =新的HttpChannel(props,null,provider);
ChannelServices.RegisterChannel(channel,false);

//导出会话对象
远程处理Services.Marshal(theSession,"TestSession");
//创建服务器对象供客户端连接
远程处理Configuration.RegisterWellKnownServiceType(
typeof(ClientComms),
"RemoteServer",
WellKnownObjectMode.Singleton);

Thread.Sleep(Timeout.Infinite);
}
}
}

客户代码:
命名空间客户端
{
班级计划
{
private static 测试会议 theSession = 空值;
静态TestClassLibrary.NotifyCallback ip = init_proc_body;
静态void Main()
{
Console.WriteLine("正在获取TestSession对象...");
theSession =(TestSession)Activator.GetObject(typeof(TestSession),"http:// localhost:1234 / 测试会议");
如果(theSession == 空值)
{
Console.WriteLine("找不到会话对象。出口。");
返回;
}
Console.WriteLine("Got Session object");
theSession.Class1.SelectWithClassDialog("test", ip, "test_str"); //这里有异常
}
公共静态无效init_proc_body(String s)
{
Console.WriteLine("Inside callback");
Console.WriteLine(s);
}
}
}
在客户端中,我试图调用函数SelectWithClassDialog("test", ip, "test_str");在这句话我会得到一个例外

未处理System.Reflection.TargetInvocationException
HResult = -2146232828
调用目标已抛出Message = Exception。
来源= mscorlib
InnerException:System.IO.FileNotFoundException
HResult = -2147024894
消息=无法加载文件或程序集“客户端,版本= 1.0.0.0,区域性=中性,公共密钥令牌=空”或其依赖项之一。该系统找不到指定的文件。
来源= mscorlib
FileName =客户端,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空
如果我在非远程模式下运行客户端程序,那么它将正常工作(在非远程模式下,我直接从客户端应用程序中的共享库获取会话,然后调用resp。函数)

如果我像SelectWithClassDialog("test", 空值, "test_str");

然后就可以了
所以我认为问题在于远程模式下的回调。
任何人都可以帮助如何使用SelectWithClassDialog("test", ip, "test_str");在带有回调的远程模式下。
我是C#的新手,并停留在这一点,非常感谢您的帮助。在此先感谢您。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,888
位置
英国
编程经验
10+
您能使用代码标签吗?这有助于保持代码的格式并使其更具可读性。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,443
位置
弗吉尼亚州切萨皮克
编程经验
10+
使用.NET 远程处理的任何特定原因?大多数人都放弃了它,转而使用Web服务和/或SignalR。
 
最佳 底部