微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

共享程序集中的 MarshalByRefObject

如何解决共享程序集中的 MarshalByRefObject

我正在尝试在 Unity 中创建一个游戏,该游戏支持通过在运行时使用新的 AppDomain 加载和卸载 DLL 来进行修改

我喜欢在 Unity 中将我的代码拆分为不同的程序集定义,以便代码可以通用且可重用于其他项目。我创建了一个名为 DomainManager 的新程序集定义,用于处理 AppDomain 管理。我在这个 DomainManager 程序集定义中创建了一个简单的 MarshalByRefObject 类。这个类是在新创建的 AppDomain 中创建的,它只是处理将 DLL 加载到该 AppDomain 中(取自 https://stackoverflow.com/a/17324102/1995360)。

namespace Systems.DomainManager
{
    public class AssemblyLoader: MarshalByRefObject
    {
        public void Load(string path)
        {
            ValidatePath(path);
            Assembly.Load(path);
        }

        public void LoadFrom(string path)
        {
            ValidatePath(path);
            Assembly.LoadFrom(path);
        }

        private void ValidatePath(string path)
        {
            if (path == null) throw new ArgumentNullException("path");
            if (!System.IO.File.Exists(path))
                throw new ArgumentException(String.Format("path \"{0}\" does not exist",path));
        }
    }
}

但是,我遇到了这个问题...

FileNotFoundException: 无法加载文件或程序集 'Systems.DomainManager,版本=0.0.0.0,文化=中性, PublicKeyToken=null' 或其依赖项之一

我正在尝试像这样创建新的 AppDomain 和 MarshalByRefObject...

dllDomain = AppDomain.CreateDomain("ModDomain",null,new AppDomainSetup() { ApplicationBase = Dir.FullName });
var assemblyLoader = (AssemblyLoader)dllDomain.CreateInstanceAndUnwrap(typeof(AssemblyLoader).Assembly.FullName,typeof(AssemblyLoader).FullName);

//Do whatever you want to do.

//Finally unload the AppDomain.
AppDomain.Unload(dllDomain);

现在,据我所知,必须将 DomainManager 程序集加载到两个 AppDomain 中才能使 MarshalByRefObject 工作,对吗?如何让新的 AppDomain 加载 DomainManager 或从主 AppDomain 的已加载程序集列表中找到它? DomainManager 已经加载到主 AppDomain 中,我只需要将它加载到新的 AppDomain 中,但我很困惑你是如何做到的!?而且由于我正在更改 ApplicationBase,这可能会阻止它解决它吗?还是因为 CreateInstanceAndUnwrap 使用的是认上下文,所以没问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。