我正在使用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中)。