0

我需要创建新的 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");
        }
    }
4

0 回答 0