【问题标题】:Activator.GetObject - MarshalByRefObjectActivator.GetObject - MarshalByRefObject
【发布时间】:2008-11-06 21:46:54
【问题描述】:

在.Net Activator.GetObject(Type type, string url, object data) 中返回对象的代理。我猜这个代理继承自 MarshalByRefObject 并且可以跨 AppDomains 发送。我说的对吗?

在我的应用程序中,我在 appdomain A 中创建一个对象并使用它 appdomain B。该对象的成员是使用 Activator.GetObject () 创建的代理对象。所以,当我在 AppDomain B 中时,我有一个在 appdomain A 中创建的对象的透明代理。当我尝试对代理对象执行调用方法时,我遇到了错误。

例如,我在 App Domain B 中创建了一个 Connection 对象。我在 App Domain A 中有 Connection 对象的透明代理。当我尝试从 AppDomain A 进行这样的调用时遇到错误。ConnectionObject。 SecurityProxy.GetSecurityAccount()。看起来问题是当我尝试像上面那样拨打电话时,它试图在 AppDomain A 中再次创建 SecurityProxy,而不是将呼叫转发到 AppDomain B。连接时已经在 AppDomain B 中创建了安全代理对象被创建。

你能帮我弄清楚我做错了什么吗?

问候, 阿尼尔。

【问题讨论】:

  • 为什么要使用GetObject 方法和一个Url 在两个appdomains 之间进行通信?可以使用 CreateInstance 从其他 appdomain 创建对象。另外,你能指定你在谈论哪些错误吗?

标签: .net remoting appdomain proxy-classes


【解决方案1】:

假设 SecurityProxy 是 ConnectionObject 上的一个属性...

您正在处理域 A 中的 ConnectionObject 代理。方法调用被转发到域 B,在那里执行它们,并将结果返回到域 A。

属性是一种编译器技巧。它使 get_X 和 set_X 这两个方法看起来是一个字段。

因此,当您调用“ConnectionObject.SecurityProxy”时,您正在调用一个方法,该方法返回一个跨应用域边界的 SecurityProxy 实例。

您必须做以下两件事之一:创建并解包 SecurityProxy 的实例并将其交给 ConnectionObject,或者将 ConnectionObject 转换为仅公开方法并且仅返回您绝对知道可以安全跨 appdomain 的类型/接受参数的外观边界。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多