我已经创建了一个具有不同基本目录的AppDomain
。但是,如果没有当前执行程序集的副本在基本目录中,我似乎无法将当前执行程序集加载到其他AppDomain中。我甚至尝试从字节加载它。
当我尝试使用时,没有异常出现:
domain.DoCallBack(new CrossAppDomainDelegate(...
我得到了以下错误信息:
无法加载文件或程序集...........系统找不到指定的文件。
我的代码如下:
private static void SaveAssemblies(Assembly ass, List<byte[]> assemblyByteList)
{
AssemblyName[] assNames = ass.GetReferencedAssemblies();
foreach (AssemblyName assName in assNames)
{
Assembly referedAss = Assembly.Load(assName);
if (!referedAss.GlobalAssemblyCache)
{
SaveAssemblies(referedAss, assemblyByteList);
}
}
byte[] rawAssembly = File.ReadAllBytes(ass.Location);
assemblyByteList.Add(rawAssembly);
}
public static AppDomain CreateAppDomain(string dir, string name)
{
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = dir;
domainSetup.ApplicationName = Path.GetFileName(dir);
domainSetup.PrivateBinPath = Path.Combine(dir, "Libs");
AppDomain domain = AppDomain.CreateDomain(name, null, domainSetup);
//Load system assemblies needed for the module
List<byte[]> assemblyByteList = new List<byte[]>();
SaveAssemblies(Assembly.GetExecutingAssembly(), assemblyByteList);
foreach (byte[] rawAssembly in assemblyByteList)
domain.Load(rawAssembly);
domain.DoCallBack(new CrossAppDomainDelegate(SetupLogging));
return domain;
}
更新:
看起来程序集已被加载,如果我查看输出,我会看到这个
'TaskExecuter.Terminal.vshost.exe' (Managed (v4.0.30319)): Loaded 'NLog' 'TaskExecuter.Terminal.vshost.exe' (Managed (v4.0.30319)): Loaded 'TaskExecuter', Symbols loaded.
但我仍然收到异常...我不理解这个。
System.IO.FileNotFoundException:找不到文件或程序集'TaskExecuter,Version = 1.0.4244.31921,Culture = neutral,PublicKeyToken = null'或其依赖项之一。系统无法找到指定的文件。 Source =mscorlibFileName = TaskExecuter,Version = 1.0.4244.31921,Culture = neutral,PublicKeyToken = null FusionLog ===预绑定状态信息=== LOG:用户= Peter-PC \ Peter LOG:DisplayName = TaskExecuter,Version = 1.0.4244.31921,Culture = neutral,PublicKeyToken = null(完全指定)LOG:Appbase =file:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks LOG:Initial PrivatePath = C:\ProgramData\TaskExecuter\TaskLib\uTorrentTasks\Libs 调用程序集:(未知)。 === LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:d:\ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter.Terminal \ bin \ Release \ TaskExecuter.Terminal.vshost.exe.Config LOG:使用主机配置文件: LOG:使用计算机配置文件来自C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config。 LOG:此时未对引用应用策略(私有、自定义、部分或基于位置的程序集绑定)。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.DLL。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.DLL。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.DLL。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.DLL。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.EXE。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.EXE。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.EXE。 LOG:尝试下载新URL文件:///C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.EXE。 StackTrace:at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection,Boolean suppressSecurityChecks)at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection)at System.Reflection.Assembly.Load(String assemblyString)at System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString(String assemblyName)at System.Reflection.MemberInfoSerializationHolder..ctor(SerializationInfo info,StreamingContext context)at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)at TaskExecuter.AppDomainHelper.CreateAppDomain(String dir,String name)in d:\ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter.AppDomainHelper.cs:line 50at TaskExecuter.TaskManagment.TaskFinder.Probe()in d:\ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskFinder.cs:line 29at TaskExecuter.TaskManagment.TaskManager.LoadTasks()in d:\ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskManager.cs:line