После обработки событие AssemblyResolve все еще получает исключение FileNotFound
Я занимался AssemblyResolve
но я все еще получаю FileNotFoundException
, Я подписался на событие в инициализаторе типа и вызываю Assembly.LoadFrom
метод в Main
-метод:
class Program
{
static Program()
{
AppDomain.CurrentDomain.AssemblyResolve+=new ResolveEventHandler(DeployAssemblyHandler);
}
static void Main(string[] args)
{
try
{
System.Reflection.Assembly asm=Assembly.LoadFrom("AxInterop.SHDocVw.dll");
}
catch(Exception)
{
}
}
public static System.Reflection.Assembly DeployAssemblyHandler(object sender,ResolveEventArgs args)
{
Assembly asm = null;
string asmName = new AssemblyName(args.Name).Name;
string deployAssemblyDirPath = ""; // Common.AppUtil.InstallDir + AppUtil.DeployedAssemblyDir;
string[] deployDirectories = Directory.GetDirectories(deployAssemblyDirPath);
foreach(string deploy in deployDirectories)
{
try
{
asm = Assembly.LoadFrom(deploy + "\\" + asmName);
break;
}
catch (Exception ex) { }
}
return asm;
}
}
4 ответа
У меня была похожая проблема, и я закончил с использованием нового AppDomain AND (важно!), Устанавливающего свойство PrivateBinPath. Хорошая вещь о другом AppDomain заключается в том, что вы можете выгрузить сборку, если она вам больше не нужна. (Мой) пример кода:
public class ProxyDomain : MarshalByRefObject
{
public bool TestAssembly(string assemblyPath)
{
Assembly testDLL = Assembly.LoadFile(assemblyPath);
//do whatever you need
return true;
}
}
AppDomainSetup ads = new AppDomainSetup();
ads.PrivateBinPath = Path.GetDirectoryName("C:\\some.dll");
AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads);
ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName);
bool isTdll = proxy.TestAssembly("C:\\some.dll");
AppDomain.Unload(ad2);
РЕДАКТИРОВАТЬ: на основе вашего комментария вы просто ищете неправильный обработчик событий. В вашем случае вы должны использовать Событие AppDomain.UnhandledException, потому что Событие AssemblyResolve имеет другое назначение.
Проблема в том, что AssemblyName.Name
свойство возвращает имя сборки без расширения. Вам нужно будет добавить ".dll"
до конца пути. (Предупреждение: это очевидно сломается, если расширение сборки не.dll)
Добавьте AxInterop.SHDocVw.dll в папку bin, она должна работать.
Попробуйте использовать Assembly.Load
в методе Main вместо Assembly.LoadFrom
,Assembly.LoadFrom
не должен даже вызывать ваш собственный распознаватель.