web-dev-qa-db-ja.com

悪名高いアセンブリバインドエラー

問題を修正する希望を失ったため、本当に助けが必要です。

Office Communications Server 64ビットライブラリを使用しています。プロジェクトで使用する3つのDLL、Microsoft.Rtc.Collaboration.dll、Microsoft.Rtc.Internal.Media.dll、およびSIPEPS.dllがあります。 Microsoft.Rtc.Collaborationについてはわかりませんが、Internal.MediaとSIPEPSは両方ともx64です。 GAC Assemblyリストでは、Rtc.CollaborationはProcessor Arhitectureの下にMSILを示し、その他はAMD64を示しています。

私のプロジェクトはこれらの参照でエラーなしでコンパイルされますが、実行時にエラーが表示されます:

ファイルまたはアセンブリ「Microsoft.Rtc.Internal.Media」またはその依存関係のいずれかをロードできませんでした。不正な形式でプログラムをロードしようとしました。

CPUをAny CPUに設定してプロジェクトをコンパイルしようとしましたが、何も変わりません。 x64とx86の両方の設定では、このエラーが発生します。

どんな助けも大歓迎です。

更新:以下はアセンブリバインディングログです。

=== Pre-bind state information ===
LOG: User = CONTOSO\elodie
LOG: DisplayName = Microsoft.Rtc.Internal.Media
 (Partial)
WRN: Partial binding information was supplied for an Assembly:
WRN: Assembly Name: Microsoft.Rtc.Internal.Media | Domain ID: 9
WRN: A partial bind occurs when only part of the Assembly display name is provided.
WRN: This might result in the binder loading an incorrect Assembly.
WRN: It is recommended to provide a fully specified textual identity for the Assembly,
WRN: that consists of the simple name, version, culture, and public key token.
WRN: See whitepaper http://go.Microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue.
LOG: Appbase = file:///C:/Users/elodie/Documents/Visual Studio 2010/Projects/TFS/proto/Main/Source/WebBot.Web/
LOG: Initial PrivatePath = C:\Users\elodie\Documents\Visual Studio 2010\Projects\TFS\proto\Main\Source\WebBot.Web\bin
Calling Assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Users\elodie\Documents\Visual Studio 2010\Projects\TFS\proto\Main\Source\WebBot.Web\web.config
LOG: Using Host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based Assembly bind).
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/e3d82f59/764fa8c3/Microsoft.Rtc.Internal.Media.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/e3d82f59/764fa8c3/Microsoft.Rtc.Internal.Media/Microsoft.Rtc.Internal.Media.DLL.
LOG: Attempting download of new URL file:///C:/Users/elodie/Documents/Visual Studio 2010/Projects/TFS/proto/Main/Source/WebBot.Web/bin/Microsoft.Rtc.Internal.Media.DLL.
ERR: Failed to complete setup of Assembly (hr = 0x8007000b). Probing terminated.
61
Élodie Petit

3つすべてのdllの64ビットバージョンを32ビットバージョンに置き換え、一時ASP.NETファイルフォルダーをクリーンアップし、再度コンパイルしました。問題なく動作するようになりました。助けてくれてありがとう。

18
Élodie Petit

ASP.NETでこの問題が発生しましたIISおよびすべてを試した後、アプリプールで32ビットを有効にし、アプリケーションプールを再起動しました。

IIS7マネージャーで:アプリケーションプール-> DefaultAppPool->詳細設定->「32ビットアプリケーションを有効にする」をtrueに設定します。

また、正しい.Netバージョンが選択されていることを確認してください。

また、ISAPI 64bitを「ISAPIおよびCGIの制限」で許可するように設定しましたが、それが助けになるかどうかわかりません。

61
Aligned

私の場合、IISExpressを使用してx64用にコンパイルされたWebプロジェクトを実行していたため、この問題が発生しました。 Visual Studioで次の設定を確認して、問題を修正しました。

ツール|オプション|プロジェクトとソリューション| Webプロジェクト| IIS Expressの64ビットバージョンを使用

これが同じシナリオと問題を抱えている他の人に役立つことを願っています

56
KabanaSoft

これらのアセンブリに対してソリューションエクスプローラーで[ローカルにコピー]を設定し、バインディングログで指定されたフォルダーにそれらがドロップされていることを確認してください。

また、おそらくV2 CLRを使用して構築されました。もしそうなら、これをweb/app configに追加してMixed Modeバインディングを有効にする必要があります

<configuration>
   <startup  useLegacyV2RuntimeActivationPolicy="true">
       <supportedRuntime version="v4.0"/>
  </startup>
</configuration> 
4
Jaimal Chohan

私はこれが古い質問であることを知っていますが、Visual Studioで部分的なバインディングエラーに関する解決策を検索するとき、まだ人気のある結果のようです。私は元のポスターと非常に似た問題を経験しましたが、EntityFramework.dllとVisual Studio 2015(.ASP Web Formsプロジェクト)を使用していましたが、見つかった解決策は広範な問題に関連しています。私は自分の解決策に似た答えを見つけられなかったので、見つけたものに貢献することが役立つと思いました。

Web.configで、サービスアカウントであるドメインユーザーを偽装しています。このサービスアカウントは一時ファイルフォルダーにアクセスできなかったため、デバッグ時にDLLをそこにコピーできなかったため、ロードできませんでした。

最終的に私たちを引き離したのは、エラーメッセージに記載されている一時フォルダーを探して物理的に調べることでした。上記の最初の質問では、「新しいURL file:/// C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files ...のダウンロードを試行しています」という行に気付くでしょう。そのフォルダには、私のDLLはありませんでした。

私にとっての解決策はこれでした:64ビット環境を使用し、ドメインアカウントを偽装しているため、ローカルサービスアカウントユーザーをローカルのC:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Filesに追加しました書き込み(および変更-適切な測定のため)アクセス権を持つフォルダー。

結論-一時ファイルフォルダーが、アプリを実行しているユーザーに書き込みアクセスを許可していることを確認してください。

2
LBW

これを解決するために、次のコマンドを実行して結果を確認することで、すべてのプロジェクトが同じバージョンを使用するようにしました。

update-package Newtonsoft.Json -reinstall

そして最後に、web.configから以下を削除しました。

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>
2
user1477388

これは古い質問ですが、今日も同じ問題を抱えていたときは依然として最高の結果でした。 Visual Studioでのプロジェクトのコンパイルを切り替えて、「すべてのCPU」ではなくx64をターゲットにしました(64ビットマシン上にあります)。他の回答によると、それを修正するには2つの方法があります-すべてを32ビットに変更するか、すべてを64ビットに変更します。この場合、64ビットが必要でした。

KabanaSoftの答え 私には完璧に機能しました。 Visual Studio 15.6.6の時点でまだ正しい。

2
Jao-Quin

私の場合、自分のサイトを調べて、サイトの名前を新しい名前に置き換えました。アセンブリ名が指定されていたWeb.configで、誤って「PreviousWebSiteName」を「NewWebSiteName」に置き換えました。

    <pages enableSessionState="false" enableViewStateMac="true" enableEventValidation="true" controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID">
  <controls>
    <add Assembly="NewWebSiteName" namespace="App_Code.Controls" tagPrefix="blog" />
  </controls>
</pages>

サイトはまだ古い名前のアセンブリを作成していました-サイトのページに表示されるサイト名のみを変更するつもりでした。内部で何かを変更する必要はありませんでした。名前を変更する前のWeb.configエントリを復元すると(ビルドされたアセンブリの名前と一致するエントリが生成されます)、エラーは解決しました。

1

Visual StudioからWebアプリケーションを実行しようとするとエラーが発生しましたが、私の場合は簡単な答えでした。例外を注意深く読んだとき、問題のアセンブリがアプリケーションによって使用されなくなったが、コピーがまだbinフォルダーに残っていることがわかりました。問題のあるアセンブリが削除された後、エラーは消えました。

1
hillstuk

私の場合、web.configにいくつかのがらくたがありました。具体的には、半角コメントアウトのhttpHandlerで、それをクリーンアップすると、バインドの問題はなくなりました。

0
woodge