【问题标题】:AssemblyResolve not fired for dependencies没有为依赖项触发 AssemblyResolve
【发布时间】:2012-10-26 13:49:25
【问题描述】:

我正在为 AssenblyResolve 事件苦苦挣扎一段时间。我搜索了 stackoverflow 并进行了其他谷歌搜索并尝试了所有我认为相关的内容。以下是更接近我的问题的链接(在我看来):

  1. AssemblyResolve is not invoked and FileNotFoundException is thrown during serialization

  2. Where to handle AssemblyResolve event in a class library?

我有一个带有静态方法的 Bootstrapper 类(为了清楚起见,我将删除我们拥有的线程安全代码:

public static void Initialize()
{
    AppDomain.CurrentDomain.AssemblyResolve += CustomResolve;
}

private static Assembly CustomResolve(object sender, ResolveEventArgs args)
{
    // There is a lot code here but basicall what it does.
    // Is determining which architecture the computer is running on and
    // extract the correct embedded dll (x86 or x64). The code was based
    // on milang on GitHub (https://github.com/milang/P4.net). And it's the same
    // purpose we want to be able to load the x86 or x64 version of the perforce dll
    // but this time with the officially Perforce supported p4api.net.
    // Once the dll is extracted we assign it to the boostrapper
    Bootstrapper._p4dnAssembly = Assembly.LoadFile(targetFileName);

    // Make sure we can satisfy the requested reference with the embedded assembly (now extracted).
    AssemblyName reference = new AssemblyName(args.Name);
    if (AssemblyName.ReferenceMatchesDefinition(reference, Bootstrapper._p4dnAssembly.GetName()))
    {
        return Bootstrapper._p4dnAssembly;
    }
}

如果我有一个带有 main 方法和静态构造函数的简单类,我就能使代码工作。静态构造函数只是调用 Boostrapper.Initialize() 方法。 在那之后,我可以使用我的库,并且它按预期工作:

public static class Test
{
    static Test()
    {
        Bootstrapper.Initialize();
    }

    public static void Main()
    {
         // Using the library here is working fine. The AssemblyResolve event was
         // fired (confirmed by a breakpoint in Visual Studio)
    }
}

我遇到的问题是是否至少存在一层依赖关系。基本上代码保持不变,但这次我的库代码在另一个库中:

public static class Test
{
    static Test()
    {
        Bootstrapper.Initialize();
    }

    public static void Main()
    {
        Class1 myClass = new Class1();

        // The following line is using the code of the extracted library, but
        // The AssemblyResolve event is not fired (or fired before I register the  
        // callback) and therefore the library is not found : result  
        // BadImageFormatException() error could not load libary because one
        myClass.Connect();
    }
}

听起来像我之前所说的链接中的#2 解释了我所看到的,但它不起作用。永远不会命中 AssemblyResove 回调上的 Visual Studio 断点。

知道发生了什么吗?

弗朗西斯

【问题讨论】:

    标签: c# assemblyresolve


    【解决方案1】:

    我知道这个问题被提出和回答已经有一段时间了,但我还是想补充一下我对这个问题的看法(因为我只是为此浪费了几个小时,也许多亏了这个,其他人就不必这样做了)

    问题基本上是这样的事实,即应用程序试图在该方法的开头解析执行该方法所需的所有程序集:

    static void main(string[] args)
    {
        // <-- here the app tries to resolve MyAssembly
        // and as MyAssembly.Class1 is not found, the app crashes
    
        // this next line is never called:
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
    
        // class contained in an assemnly that we need to resolve
        MyAssembly.Class1 myClass = new MyAssembly.Class1();
    }
    

    这就是上面会崩溃的原因:永远不会调用 ResolveAssembly 事件处理程序,因为它从未被连接。

    这也是以下解决方案有效的原因(由 OP 发布):

    static void main(string[] args)
    {
        Initialize();
        RealMain();
    }
    
    static void Initialize()
    {
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
    }
    
    static void RealMain()
    {
       // <-- here the app tries to resolve MyAssembly
       // class contained in an assemnly that we need to resolve      
       MyAssembly.Class1 myClass = new MyAssembly.Class1();
       // and everything is OK
    }
    

    【讨论】:

      【解决方案2】:

      有人确实回答了,但答案已被删除。所以我不能将其标记为已回答。 基本上代码不需要在“main”方法之外的事实是有效的。 从一个新项目开始,解决问题,所以我想我的 dll 有一些问题(可能是 x64 文件夹中的 x86 dll,反之亦然)

      static void main(string[] args)
      {
          Boostrapper.Initialize();
          RealMain();
      }
      
      static void RealMain()
      {
          Class1 myClass = new Class1();
          myClass.Connect();
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-28
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 2014-08-20
        • 2020-03-17
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        相关资源
        最近更新 更多