Я изучал это в течение нескольких дней. Я пытаюсь правильно создать экземпляр класса внутри внешней сборки под собственным AppDomain.Выполнение сборки dll при новом AppDomain
Я смогла загрузить внешнюю сборку под новым AppDomain, однако все ее зависимости, похоже, загружаются в родительский AppDomain, который побеждает цель, так как я хочу выгрузить позже dll, чтобы отпустить блокировку на них (система плагинов). Любая идея о том, почему это будет сделано?
public MyCustomObject BindAssembly()
{
string currentAssemblyPath = @"C:\PathToMy\Assembly";
string currentAssemblyFile = @"C:\PathToMy\Assembly\MyAssembly.dll";
AssemblyName currentAssemblyName = AssemblyName.GetAssemblyName(currentAssemblyFile);
AppDomain domain = AppDomain.CurrentDomain;
domain.AssemblyResolve += domain_AssemblyResolve;
AppDomainSetup setup = new AppDomainSetup()
{
PrivateBinPath = currentAssemblyPath,
ApplicationBase = domain.BaseDirectory,
DynamicBase = domain.SetupInformation.DynamicBase,
ShadowCopyFiles = domain.SetupInformation.ShadowCopyFiles,
CachePath = domain.SetupInformation.CachePath,
AppDomainManagerAssembly = domain.SetupInformation.AppDomainManagerAssembly,
AppDomainManagerType = domain.SetupInformation.AppDomainManagerType
};
AppDomain newDomain = AppDomain.CreateDomain("NewDomain", AppDomain.CurrentDomain.Evidence, setup);
newDomain.AssemblyResolve += newDomain_AssemblyResolve;
currentAssembly = newDomain.Load(currentAssemblyName);
// tried this too
//var obj = domain.CreateInstanceFromAndUnwrap(currentAssemblyFile, className);
// list all of the assemblies inside the custom app domain
var newDomainAssemblies = newDomain.GetAssemblies(); // (contains my loaded assembly, but not dependencies)
// list all of the assemblies inside the parent app domain
var appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); // (contains my loaded assembly as well as all dependencies)
return obj as MyCustomObject;
}
// resolve dependencies in custom domain
Assembly newDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
// this never fires
AppDomain domain = (AppDomain)sender;
}
// resolve dependencies in parent domain
Assembly domain_AssemblyResolve(object sender, ResolveEventArgs args)
{
AppDomain domain = (AppDomain)sender;
string assemblyDependencyPath = String.Format(@"{0}", Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(args.RequestingAssembly.CodeBase).Path)));
string[] files = Directory.GetFiles(assemblyDependencyPath, "*.dll", SearchOption.AllDirectories);
foreach (string file in files)
{
// if we found it, load the assembly and cache it.
AssemblyName aname = AssemblyName.GetAssemblyName(file);
if (aname.FullName.Equals(args.Name))
{
Assembly assembly = domain.Load(aname);
//Assembly assembly = Assembly.LoadFrom(file); // also tried this, same result
return assembly;
}
}
}
вы пробовали 'currentAssembly = newDomain.Load (currentAssemblyName);' вместо 'currentAssembly = domain.Load (currentAssemblyName);'? – Rhumborl
Я также подтвердил, что если я выгружаю новый AppDomain, который я создал, зависимые сборки все еще остаются в родительском AppDomain. –
Rhumborl - Извиняюсь, что это была опечатка в моем коде заглушки. Исправлено в моем вопросе. –