首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在处理AssemblyResolve事件后仍然得到异常FileNotFound

在处理AssemblyResolve事件后仍然得到异常FileNotFound
EN

Stack Overflow用户
提问于 2013-10-08 14:08:21
回答 4查看 1.9K关注 0票数 3

我处理过AssemblyResolve-event,但仍然得到了FileNotFoundException。我在类型初始化器中订阅了事件,并在Main-method中调用了Main方法:

代码语言:javascript
复制
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;
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-21 10:35:37

我遇到了类似的问题,最后使用了一个新的AppDomain和()来设置PrivateBinPath属性。另一个AppDomain的好处是,如果不再需要程序集,则可以卸载它。(我的)示例代码是:

代码语言:javascript
复制
  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事件有不同的用途。

票数 4
EN

Stack Overflow用户

发布于 2013-10-22 12:38:26

问题是,AssemblyName.Name属性返回没有扩展的程序集的名称。您需要将".dll"添加到路径的末尾。(警告:如果程序集的扩展不是.dll,这显然会中断)

票数 2
EN

Stack Overflow用户

发布于 2013-10-18 11:07:59

尝试在主方法中使用Assembly.Load而不是Assembly.LoadFromAssembly.LoadFrom甚至不应该调用您的自定义解析器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19250006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档