【问题标题】:How to call callback in remoting in c#如何在 C# 远程处理中调用回调
【发布时间】:2014-04-01 19:44:58
【问题描述】:

我在 C 库上有一个 C# 包装器。 在 C lib 中,我有将回调作为输入的函数。 在 C# 中,我公开了像委托这样的回调。

在正常模式下一切正常,但是当我尝试在远程模式下调用相同的函数时,它会出现异常 无法加载文件或程序集。 我的远程处理方案是这样的

1)SharedLib:我有一个 c# 共享库,它的函数是 C 函数的包装器。 所有函数都在这个库中定义。

2)服务器控制台应用:服务器的作用是从 Shredlib 中获取会话并打开一个端口,以便客户端向服务器请求会话

3)客户端控制台应用程序:客户端监听服务器打开的端口并从服务器获取会话对象。它定义了一个与sharedlib中的委托具有相同签名的函数 在会话对象客户端调用来自 sharedLib 的方法,该方法将回调作为输入。 客户端将具有相同签名的方法的地址传递给来自 sharedLib 的方法的委托,该方法期望回调作为输入。

在此之后我得到了“无法加载文件或程序集”之类的异常。

如果我将 null 传递给将回调作为输入的参数,那么在远程模式下一切正常。 那么任何人都可以帮助在远程模式下使用回调。

【问题讨论】:

  • 看看System.CrossAppDomainDelegate

标签: .net-remoting


【解决方案1】:

三个建议:

1) 不同的 AppDomain 是否以相同的信任级别运行?如果信任级别较低,则第二个域可能无权加载程序集。

2) 远程应用程序在加载程序集的目录中没有可用的所有依赖项。

3) 两个应用程序是否在相同版本的 .NET 下运行?如果一个是 .NET 4.5,一个是 .NET 3.5,并且那里有一个 .NET 4.0 程序集,那么第二个进程将无法运行它。

您可以尝试打开 Fusion 程序集绑定日志记录,看看是否有更详细的加载失败原因。

【讨论】:

  • 详细异常是无法加载文件或程序集'select_bodies_with_class_selection_and_filter_callback,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null'或其依赖项之一。该系统找不到指定的文件。调用的目标已引发异常。服务器堆栈跟踪:在 System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) 处的 System.RuntimeMethodHandle.SerializationInvoke(IRuntimeMethodInfo 方法, 对象目标, SerializationInfo 信息, StreamingContext& 上下文)
  • 在 System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) 在 System.Runtime.Serialization.ObjectManager.DoFixups() 在 System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler处理程序,ISerParser serParser) 在 System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream, HeaderHandler handler) 在 System.Runtime.Remoting.Channels.CoreChannel.DeserializeSoapRequestMessage(Stream inputStream, Header[] h, Boolean bStrictBinding, TypeFilterLevel securityLevel)
  • 在 System.Runtime.Remoting.Channels.SoapServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream)
  • "select_bodies_with_class_selection_and_filter_callback, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'" 看起来像是在临时程序集中生成的某种匿名类型(0.0.0.0 版本是可疑的)。编译器生成的类型没有被修饰为 [Serializable],因此无法远程处理。也许这就是你的问题所在。
猜你喜欢
  • 2014-04-17
  • 2014-09-20
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多