我处理过AssemblyResolve-event,但仍然得到了FileNotFoundException。我在类型初始化器中订阅了事件,并在Main-method中调用了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;
}
}发布于 2013-10-21 10:35:37
我遇到了类似的问题,最后使用了一个新的AppDomain和(!)来设置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事件有不同的用途。
发布于 2013-10-22 12:38:26
问题是,AssemblyName.Name属性返回没有扩展的程序集的名称。您需要将".dll"添加到路径的末尾。(警告:如果程序集的扩展不是.dll,这显然会中断)
发布于 2013-10-18 11:07:59
尝试在主方法中使用Assembly.Load而不是Assembly.LoadFrom。Assembly.LoadFrom甚至不应该调用您的自定义解析器。
https://stackoverflow.com/questions/19250006
复制相似问题