我有一个小的控制台应用程序备份然后将新的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.AssemblyResolve
和ResolveEventHandler
解决依赖关系,所以我通过在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依赖,但我甚至无法找到它。