我试图找出是否有办法创建从app域引用的我的对象的本地实例,原因是由于我在方法的所有执行过程中获得了大量的聊天。因此,我不必一直调用远程对象,而只是调用在方法中创建的本地实例。
我一直在关注RemotingServices Marshal和GetObjectData方法,但一直无法弄清楚它们是否会起作用,谷歌也没有帮助
所以类定义如下所示
[XmlRoot("SI")]
public class SI : MarshalByRefObject, IXmlSerializable
然后运行时该类的实例看起来像这样。
Name: Service
Value: {System.Runtime.Remoting.Proxies.__TransparentProxy}
Type: SI {System.Runtime.Remoting.Proxies.__TransparentProxy}
我希望按照以下
的顺序完成我所需的工作var uri =RemotingServices.GetObjectUri(Service);
var serv = RemotingServices.Marshal(Service, uri, typeof(SI)); //Service is the object I described above
SerializationInfo info = new SerializationInfo(typeof(SI), new FormatterConverter());
StreamingContext context = new StreamingContext(StreamingContextStates.All);
serv.GetObjectData(info, context);
var t2 = serv.GetRealObject(context);
调用GetRealObject时出现以下错误 “尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”
我还没有找到任何方法来实现这一点,任何人都可能有一些建议吗?
答案 0 :(得分:0)
好。因此,要么安装Unity,要么创建自己的资源定位器(对象字典)。
以下是我写的资源定位器:
using System;
using System.Collections.Generic;
namespace Bizmonger.Client.Infrastructure
{
public class ServiceLocator
{
#region Members
Dictionary<Type, object> _dictionary = new Dictionary<Type, object>();
static ServiceLocator _serviceLocator = null;
#endregion
public static ServiceLocator Instance
{
get
{
if (_serviceLocator == null)
{
_serviceLocator = new ServiceLocator();
}
return _serviceLocator;
}
}
public object this[Type key]
{
get
{
if (!_dictionary.ContainsKey(key))
{
_dictionary.Add(key, Activator.CreateInstance(key));
}
return _dictionary[key];
}
set
{
_dictionary[key] = value;
}
}
public bool ContainsKey(Type type)
{
return _dictionary.ContainsKey(type);
}
public void Load(object data)
{
if (data == null) { return; }
RemoveExisting(data);
_dictionary.Add(data.GetType(), data);
}
public void Load(Type type, object data)
{
if (data == null) { return; }
RemoveExisting(data);
_dictionary.Add(type, data);
}
#region Helpers
private void RemoveExisting(object data)
{
bool found = _dictionary.ContainsKey(data.GetType());
if (found)
{
_dictionary.Remove(data.GetType());
}
}
#endregion
}
}
然后您可以在您的客户端执行此操作:
var uri =RemotingServices.GetObjectUri(Service);
var serv = RemotingServices.Marshal(Service, uri, typeof(SI));
ServiceLocator.Instance.Load(serv);
您可以像这样检索此对象:
var server = ServiceLocator.Instance[typeof(some_class)] as some_class;