Assembly.Load + AppDomain.CreateDomain

时间:2016-11-04 19:27:08

标签: c# .net appdomain appdomainsetup

我正在使用CLRHostHelper.dll方法加载新程序集(Assembly.Load( byte[] ))。从那个程序集中我调用AppDomain.CreateDomain - 方法抛出异常:

Exception thrown: 'System.IO.FileNotFoundException' in mscorlib.dll Additional information: Could not load file or assembly 'CLRHostHelper, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

我最了解新的appDomain创建只有在磁盘上存在.dll时才能继续(使用AppDomainSetup domainSetup = new AppDomainSetup() { ApplicationBase = inDir };可以指定从哪个文件夹) - 并且它不可能只在RAM中加载它。

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

也无法立即挂钩新appDomain的AssemblyResolve - 没有这样的方法。

在AppDomainSetup类中 - 还存在AppDomainManagerAssembly和AppDomainManagerType - 可从此处找到更多信息: https://blogs.msdn.microsoft.com/shawnfa/2004/11/12/the-managed-hosting-api/ 从理论上讲,我们可以创建自己的AppDomainManager,并覆盖EntryAssembly以提供我们自己的程序集,但是:

domainSetup.AppDomainManagerAssembly = Assembly.GetExecutingAssembly().FullName;
domainSetup.AppDomainManagerType = "EchoAppDomainManager";

这里再次指定程序集名称,需要从磁盘加载。

在这里 - http://andrewzak.tumblr.com/ - Small .NET desktop applications. Turning on shadow copying.有一些关于类似问题的提及,并且可能使用SetAppDomainManagerType走动 - 但没有执行此操作的实际示例。也许你可以在其他地方找到它?

任何人都可以推荐我如何从ram中的程序集创建appDomain而不从硬盘执行任何加载(一切都将保留在ram中)。

0 个答案:

没有答案