외부 어셈블리로드를 직접 처리해야하는 환경에서 사용하는 DLL이 있습니다. 어셈블리를 AppDomain에로드하려고합니다. 이 잘 CurrentAppDomain 함께 시도 할 때 작동하지만이 자신을 만드는 appdomain이 작업을 수행 할 때 실패합니다. 배경은 결국 어셈블리가 "해제"되도록 맨 끝에서 appdomain을 언로드하려고합니다.MyAppDomain AssemblyResolve C#
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;
}
제 질문은 어떻게 어셈블리를로드하기 위해 만든 appdomain을 사용합니까?
"작동하지 않는다"고 할 때, 당신은 무엇을 의미합니까? 이벤트, 예외 등이 없습니까? –
왜 zipDomain2.AssemblyResolve 이벤트를 사용하지 않는지 알기가 어렵습니다. 아니면 AppDomainSetup을 좋아하는 방식으로 설정하지 않아도됩니다. 문제 해결을 위해 Fuslogvw.exe를 사용하십시오. –
@Steve Mitcham 어셈블리를 찾을 수 없다는 예외가 제기됩니다. 내 문제는 CurrentDomain과 함께 작동한다는 것입니다. – Bongo