创建从AppDomain引用的对象的本地实例

时间:2014-07-28 14:29:39

标签: c# appdomain marshalbyrefobject

我试图找出是否有办法创建从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时出现以下错误 “尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”

我还没有找到任何方法来实现这一点,任何人都可能有一些建议吗?

1 个答案:

答案 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;