在另一个文件夹

时间:2018-02-05 10:51:33

标签: c# .net dll reflection

我有一个小的控制台应用程序备份然后将新的DLL复制到安装文件夹,然后应该重新注册新的DLL。它还可以从备份中恢复DLL,然后重新注册备份。

我有以下代码来执行注册:

Assembly asm = Assembly.LoadFrom(Path.Combine(Path.GetFullPath(options.RemotePath), Path.GetFileName(file)));
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);

我在调用Assembly.LoadFrom时遇到问题我收到System.IO.FileLoadException消息A procedure imported by 'MyLib.dll' could not be loaded

我认为这可能是远程文件夹中无法加载的DLL,所以我将注册码包装在当前目录的更改中:

var wd = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(options.RemotePath);
...
Directory.SetCurrentDirectory(wd);

不幸的是,这似乎无法解决问题。我做了一些调查,发现我可以告诉AppDomain如何使用AppDomain.CurrentDomain.AssemblyResolveResolveEventHandler解决依赖关系,所以我通过在Main的开头添加此代码来设置它,在我的注册码之前。

var otherCompanyDlls = new DirectoryInfo(options.RemotePath).GetFiles("*.dll");

Console.WriteLine("Setting AssemblyResolve");
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler((sender, a) =>
{
    Console.WriteLine("Looking for {0}", a.Name);
    var dll = otherCompanyDlls.FirstOrDefault(fi => fi.Name == a.Name);
    if (dll == null)
    {
        return null;
    }

    return Assembly.LoadFrom(dll.FullName);
});

我仍然得到相同的错误,并且似乎永远不会触发此AssemblyResolve处理程序代码,因为我添加的控制台行永远不会被写入。

我做错了什么?我希望至少找出它试图加载的DLL依赖,但我甚至无法找到它。

0 个答案:

没有答案