如何将仅内存中存在的执行程序集加载到新的AppDomain中?

时间:2018-07-06 16:11:53

标签: c# appdomain assemblybinding

我需要创建新的AppDomain并将执行的程序集传递给它,而无需访问程序集文件本身。 我尝试使用二进制序列化程序来传输已加载的程序集,但是仅使用内存中存在的程序集就无法做到这一点。

问题在于新AppDomain引发程序集加载异常,因为当前目录中没有此类文件。

更新: 即使我找到了一种获取实际程序集字节数组的方法,将其保存到磁盘并强制将其加载到新的AppDomain中-仍然存在转换错误-我无法将其从代理类型转换为实际的类或接口。

示例项目: https://drive.google.com/open?id=16z9nr8W5D8HjkBABgOCe5MIZKJSpFOul

更新2: 当从硬盘驱动器上的程序集执行时,以下示例正在工作-无需搜索程序集文件,并且在FullName方法中,程序集CreateInstanceFromAndUnwrap就足够了。从字节数组加载包含此代码的程序集时,将发生所有错误。 用法:

 public sealed class LoadDomain: IDisposable 
    {
        private AppDomain _domain;
        private IFacade _value;
        public IFacade Value
        {
            get
            {
                return _value;
            }
        }

        public void Dispose()
        {
            if (_domain != null)
            {
                AppDomain.Unload(_domain);

                _domain = null;
            }
        }
        public void Load(byte[] assemblyBytes,string assemblyPath,string assemmblyDir)
        {
            var domainSetup = new AppDomainSetup()
            {
                ShadowCopyDirectories = "true",
                ShadowCopyFiles = "true",
                ApplicationName = Assembly.GetExecutingAssembly().ManifestModule.ScopeName,
                DynamicBase = assemmblyDir,
                LoaderOptimization = LoaderOptimization.MultiDomainHost,
            };
            _domain = AppDomain.CreateDomain("Isolated:" + Guid.NewGuid(), null, domainSetup);
            // _domain.Load(assemblyBytes); not working
            // _domain.AssemblyResolve+=.. not working
             Type type = typeof(Facade);
            _value = (IFacade)_domain.CreateInstanceFromAndUnwrap(assemblyPath, type.FullName);
            //assemlby path working, but casting error : InvalidCastException
            //assembly FullName not working: FileNotFoundException
        }
    }
    public class Facade : MarshalByRefObject, IFacade
    {
        public void DoSomething()
        {
            MessageBox.Show("new domain");
        }
    }

0 个答案:

没有答案