C# 组装。加载和#x2B;AppDomain.CreateDomain

C# 组装。加载和#x2B;AppDomain.CreateDomain,c#,.net,appdomain,appdomainsetup,C#,.net,Appdomain,Appdomainsetup,我正在使用assembly.Load(byte[])方法加载新程序集(CLRHostHelper.dll)。我正在从该程序集中调用AppDomain.CreateDomain-方法引发异常: 在mscorlib.dll中引发异常:“System.IO.FileNotFoundException” 其他信息:无法加载文件或程序集“CLRHostHelper,版本=0.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。 据我所知,只有在磁盘上实际

我正在使用
assembly.Load(byte[])
方法加载新程序集(
CLRHostHelper.dll
)。我正在从该程序集中调用
AppDomain.CreateDomain
-方法引发异常:

在mscorlib.dll中引发异常:“System.IO.FileNotFoundException”
其他信息:无法加载文件或程序集“CLRHostHelper,版本=0.0.0.0,区域性=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

据我所知,只有在磁盘上实际存在.dll时(使用
AppDomainSetup domainSetup=new-AppDomainSetup(){ApplicationBase=inDir};
才可以指定从哪个文件夹创建新的appDomain),并且不能仅在ram中加载它

可以使用
AppDomain.CurrentDomain.AssemblyResolve+=newapp\u AssemblyResolve-但该事件仅适用于当前appDomain,而不适用于新创建的appDomain

也不可能立即钩住新appDomain的AssemblyResolve,因为没有这样的方法

在AppDomainSetup类中-也存在AppDomainManagerAssembly和AppDomainManagerType-可以从此处找到更多信息: 理论上,我们可以创建自己的AppDomainManager,并覆盖EntryAssembly以提供自己的程序集,但是:

domainSetup.AppDomainManagerAssembly = Assembly.GetExecutingAssembly().FullName;
domainSetup.AppDomainManagerType = "EchoAppDomainManager";
这里再次指定程序集名称,然后需要从磁盘加载程序集名称

在这里---
小型.NET桌面应用程序。打开卷影复制。
有人提到类似的问题,以及使用
SetAppDomainManagerType进行的潜在漫游,但没有执行此操作的实际示例。也许你能找到别的地方


有谁能推荐我如何从ram中的程序集创建appDomain,而不从硬盘执行任何加载操作(所有内容都保存在ram中)。

好的,这是不可能的,因为
appDomain.CreateInstanceAndUnwrap
需要程序集名称,并将从磁盘加载它。你说过你会从磁盘加载DLL,为什么不把DLL也用于
AppDomain
的东西呢?或者一个更一般的问题,这里的用例是什么,即为什么需要动态加载程序集,然后再创建
AppDomain
?为什么不在调用代码中创建
AppDomain
?我正在分析这个问题的更深层次的答案:目前我可以创建不可加载的程序集,但我想从磁盘中删除额外的C#hosting.dll(不必要的线索)。当然,不删除这个dll也可以存活下来,但我真的想了解这里的替代方案。为什么我不能直接加载和卸载组件?!为什么我不能从ram中完成它?