2

我有一个问题,我的用户控件在运行时找不到特定的引用程序集。

我在运行时从嵌入式资源中提取引用的程序集,但这是用户控件在提取之前以某种方式寻找的唯一程序集,因此无法找到它。

为什么应用程序不等待创建程序集的实例来查找它?

我试图理解。为什么这个程序集属于“预绑定”类别?

下面的融合日志

*** Assembly Binder Log Entry  (8/15/2012 @ 8:55:28 AM) ***

    The operation failed.
    Bind result: hr = 0x80070002. The system cannot find the file specified.

    Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Running under executable  C:\Temp\gn\WPFDemo\bin\Debug\WPFDemo.exe
    --- A detailed error log follows. 

    === Pre-bind state information ===
    LOG: User = xxxx
    LOG: DisplayName = AVX.NET, Version=1.2.0.1551, Culture=neutral, PublicKeyToken=4300bc540bfb680e
     (Fully-specified)
    LOG: Appbase = file:///C:/Temp/gn/WPFDemo/bin/Debug/
    LOG: Initial PrivatePath = NULL
    LOG: Dynamic Base = NULL
    LOG: Cache Base = NULL
    LOG: AppName = WPFDemo.exe
    Calling assembly : Test, Version=1.0.6.39680, Culture=neutral, PublicKeyToken=4300bc540bfb680e.
    ===
    LOG: This bind starts in default load context.
    LOG: Using application configuration file: C:\Temp\gn\WPFDemo\bin\Debug\WPFDemo.exe.Config
    LOG: Using host configuration file: 
    LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
    LOG: Post-policy reference: AVX.NET, Version=1.2.0.1551, Culture=neutral, PublicKeyToken=4300bc540bfb680e
    LOG: GAC Lookup was unsuccessful.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET.DLL.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET/AVX.NET.DLL.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET.EXE.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET/AVX.NET.EXE.
    LOG: All probing URLs attempted and failed.

    *** Assembly Binder Log Entry  (8/15/2012 @ 8:55:28 AM) ***

    The operation failed.
    Bind result: hr = 0x80070002. The system cannot find the file specified.

    Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Running under executable  C:\Temp\gn\WPFDemo\bin\Debug\WPFDemo.exe
    --- A detailed error log follows. 

    === Pre-bind state information ===
    LOG: User = xxxx
    LOG: DisplayName = AVX.NET, Version=1.2.0.1551, Culture=neutral, PublicKeyToken=4300bc540bfb680e
     (Fully-specified)
    LOG: Appbase = file:///C:/Temp/gn/WPFDemo/bin/Debug/
    LOG: Initial PrivatePath = NULL
    LOG: Dynamic Base = NULL
    LOG: Cache Base = NULL
    LOG: AppName = WPFDemo.exe
    Calling assembly : Test, Version=1.0.6.39680, Culture=neutral, PublicKeyToken=4300bc540bfb680e.
    ===
    LOG: This bind starts in default load context.
    LOG: Using application configuration file: C:\Temp\gn\WPFDemo\bin\Debug\WPFDemo.exe.Config
    LOG: Using host configuration file: 
    LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
    LOG: Post-policy reference: AVX.NET, Version=1.2.0.1551, Culture=neutral, PublicKeyToken=4300bc540bfb680e
    LOG: GAC Lookup was unsuccessful.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET.DLL.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET/AVX.NET.DLL.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET.EXE.
    LOG: Attempting download of new URL file:///C:/Temp/gn/WPFDemo/bin/Debug/AVX.NET/AVX.NET.EXE.
    LOG: All probing URLs attempted and failed.
4

1 回答 1

1

CLR 有几个触发器来加载程序集。除了显式的 Assembly.LoadXxx() 调用之外,迄今为止最常见的调用是即时编译器。这需要程序集在该方法执行之前为该方法正确生成代码。

因此,如果您有任何代码使用此类程序集中的类型,并且该代码与您提取 DLL 的代码“接近”,那么您很可能会得到这个结果。在您的提取代码可以运行之前,抖动很可能需要程序集。

您必须特别注意抖动优化器执行的内联优化,在没有附加调试器的情况下在发布版本中启用。现在“关闭”超出了方法体。为了防止这种情况发生,从执行 DLL 提取代码的方法调用的任何方法都必须用 [MethodImpl(MethodImplOptions.Noinlining)] 修饰。

使用这种方法,您可能会遇到另一个问题。您似乎没有编写自定义 AppDomain.AssemblyResolve 事件处理程序。或者它可能还没有注册。在最新版本的 Windows 上,您无法将 DLL 提取到与 EXE 相同的目录,UAC 会阻止此操作。需要解压到可写目录。说 TEMP 目录。然后需要一个自定义程序集解析处理程序。当可执行文件不知从何处出现时,病毒扫描程序会感到紧张,这是另一种高度随机且完全无法诊断的可能故障模式。

使用部署单个可执行文件的最常见方法来避免此类问题。一个名为 setup.exe,由安装项目创建。在VS中很容易做到。

于 2012-08-15T13:37:15.530 回答