【发布时间】:2015-01-28 13:58:16
【问题描述】:
我有一个 DLL,我在需要自己处理外部程序集负载的环境中使用它。我想将程序集加载到 AppDomain 中。当我使用 CurrentAppDomain 尝试此操作时效果很好,但是在我自己创建的应用程序域中执行此操作时失败。 背景是我想在最后卸载appdomain,以便最终“释放”程序集。
public ZipEx()
{
try
{
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
//THIS CODE WORKS
//System.AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
//System.AppDomain.CurrentDomain.Load("ICSharpCode.SharpZipLib");
//THIS CODE DOES NOT WORK
AppDomain zipDomain2 = AppDomain.CreateDomain("ADZib2", adevidence, domaininfo);
PolicyLevel polLevel = PolicyLevel.CreateAppDomainLevel();
PermissionSet permSet = new PermissionSet(PermissionState.Unrestricted);
permSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.AllFlags));
polLevel.RootCodeGroup.PolicyStatement = new PolicyStatement(permSet);
zipDomain2.SetAppDomainPolicy(polLevel);
zipDomain2.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("ex in ctor" + Environment.NewLine + ex.ToString());
}
if (_loadedAssembly == null)
{
}
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
System.Windows.Forms.MessageBox.Show("CurrentDomain_AssemblyResolve");
Assembly assembly = null;
bool foundAssembly = false;
int idx = args.Name.IndexOf(',');
if (idx > 0)
{
string partialName = args.Name.Substring(0, idx);
string dllName = partialName + ".dll";
//Add the directorys where the assembly hould be resolved
List<string> directorySearch = new List<string>
{
string.Format("{0}{1}{2}",Environment.CurrentDirectory,Path.DirectorySeparatorChar, dllName),
string.Format("{0}{1}{2}",AppPath,Path.DirectorySeparatorChar, dllName)
};
foreach (string fileName in directorySearch)
{
if (File.Exists(fileName))
{
foundAssembly = true;
assembly = Assembly.LoadFrom(fileName);
break;
}
}
if (assembly == null)
{
if (!foundAssembly)
{
foreach (string fileName in directorySearch)
{
}
}
else
{
}
}
}
if (assembly != null)
{
System.Windows.Forms.MessageBox.Show("assembly is not null");
}
return assembly;
}
我的问题是如何使用我创建的应用程序域来加载程序集?
【问题讨论】:
-
当你说“不起作用”时,你是什么意思?没有事件、异常等?
-
很难理解为什么您不使用 zipDomain2.AssemblyResolve 事件。或者不只是按照您喜欢的方式设置 AppDomainSetup。使用 Fuslogvw.exe 进行故障排除。
-
@Steve Mitcham 我的意思是它引发了一个没有找到程序集的异常。我的问题是它适用于 CurrentDomain
-
正如@HansPassant 所说,fuslogvw.exe 将为您提供 CLR 用来尝试解决您的程序集的路径,因此您将能够找出它为什么找不到文件.
-
好的,我会尝试的,但是为什么相同的 Resolve 方法对 CurrentDomain 有效?
标签: c# appdomain assembly-loading