2

I am having a problem where my user control does not find a specific referenced assembly at runtime.

I am extracting the referenced assemblies at run time from embedded resources, but this is the only assembly that somehow the user control is looking for before it can be extracted, so it cannot find it.

Why is it that the application does not wait for the instance of the assembly to be created to look for it ?

I am trying to understand. Why does this assembly fall into the "pre-bind" category ?

Fusion Log below

*** 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ではEXEと同じディレクトリにDLLを抽出できません。UACはこれを停止します。書き込み可能なディレクトリへの抽出が必要です。TEMPディレクトリと言います。次に、カスタムアセンブリ解決ハンドラーが必要です。実行可能ファイルがどこからともなく現れると、ウイルススキャナーは神経質になります。これは、非常にランダムでまったく診断できない可能性のある別の障害モードです。

単一の実行可能ファイルをデプロイする最も一般的な方法で、この種の問題を回避してください。setup.exeと呼ばれ、たとえばSetupプロジェクトによって作成されたもの。VSで簡単に行えます。

于 2012-08-15T13:37:15.530 に答える