web-dev-qa-db-ja.com

ASP.netアプリがクラッシュする-ファイルまたはアセンブリ 'Microsoft.Threading.Tasks.Extensions.Desktop'を読み込めませんでした

OAuth2と.Net 4.5フレームワークを使用して、Google BigQuery C#ASP.netアプリケーションを構築したいと思います。これらのNuGetインストールを実行しました

Install-Package Google.Apis.Bigquery.v2 -Pre
Install-Package Google.Apis.Authentication.OAuth2 -Version 1.2.4696.27634

Install-Package Google.Apis -Pre
Install-Package Google.Apis.Auth -Pre

そして、関連する「使用法」を分離コードファイル「default.aspx.cs」に配置しました。

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Bigquery.v2;
using Google.Apis.Bigquery.v2.Data;

namespace BigQueryDemoApp
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            UserCredential credential;
            FileStream stream;

            using (stream = new FileStream(
                    Server.MapPath("~/client_secrets.json"),
                    FileMode.Open, FileAccess.Read)
                )
            {
                GoogleWebAuthorizationBroker.Folder =
                    "Tasks.Auth.Store";
                credential = GoogleWebAuthorizationBroker.
                    AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    new[] { BigqueryService.Scope.Bigquery },
                    "user", CancellationToken.None).Result;
            }

            // Initialize the service.
            var Service = new BigqueryService(
                new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "BigQueryDemo"
                }
            );
        }
    }
}

この特定のページをプロジェクトの開始ページとして設定しました。 GoogleコンソールでクライアントIDファイルを作成したときに「インストール済みアプリケーション」を選択しました

APIS & auth -> Credentials -> CREATE NEW CLIENT ID

vS2013のソリューションエクスプローラーでこのファイル(client_secrets.json)を追加したことを確認しました。コードビハインドで、Server.MapPathを使用してclient_secretsファイルに正しくマップしたことを確認しました。信任状機構には、このコードを使用しました

<https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2>

出発点として。アプリを実行すると、次で始まるブラウザエラーページが返されます

ファイルまたはアセンブリ 'Microsoft.Threading.Tasks.Extensions.Desktop、Version = 1.0.16.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

"credential ="行でクラッシュします。実際のASP.netがクラッシュしたブラウザページの画像を追加して、アセンブリロードトレース/スタックトレースなどを表示しようとしましたが、これに対するアカウント権限がないようです。 "credential ="行にブレークポイントを設定してから、アプリを実行すると

DEBUG -> Start Debugging

vS2013では、ページは "credential ="行で停止し、ファイルピッカーが開いてファイルを探します

"GoogleClientSecrets.cs"

ディレクトリから

「c:\ code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis.Auth\OAuth2\GoogleClientSecrets.cs」

ドライブのどこにもありません。生成されたASP.netエラーページでアセンブリロードトレースを使用して、提案された構成ファイルを調べてみましたが、何も機能しませんでした。より一般的には、StackOverflowでこの問題を探してみましたが、それについての言及はいくつかありましたが、その資料のどれも役に立ちませんでした。

18
Frank Solomon

エラーはMicrosoft.Bcl.Asyncの最新バージョンが.NET 4.5で機能しないという事実に基づいているため、次のことを試すことができます。

パッケージマネージャーコンソールを開き、次のコマンドを実行します。
1)アンインストールパッケージMicrosoft.Bcl.Async -Force
2)インストールパッケージMicrosoft.Bcl.Async -Version 1.0.16

現在書いているサンプルで動作します。うまくいくかどうか教えてください。

更新(3月21日):パッケージを更新できます(新しいバージョン1.0.166-betaが利用可能です https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.166-beta )。
。NET 4.5フレームワークを使用してVS2013でテストしたところ、正常に動作しました。

29
peleyal

-Package Microsoft.Bcl.Asyncの新しいバージョンをリリースしました。

誰かがこの問題を抱えている場合は、1.0.16ではなく"latest"バージョンをインストールしてください。

私はそれがあなたのために働くことを望みます。

4
user3255303

以前にこのエラーが発生しました。 .NET 4.0アプリケーションを実行すると、Bcl.AsyncパッケージにMicrosoft.Threading.Tasks.Extensions.Desktopへの参照が含まれているように見えますが、.NET 4.5アプリケーションには何とか不足しています。

あなたへの私のアドバイス(Microsoft.Bcl.Asyncの所有者と一緒に私たちが理解するまで)は、packages\Microsoft.Bcl.Async.1.0.165\libからMicrosoft.Threading.Tasks.Extensions.Desktopをコピーすることです\ net40\Microsoft.Threading.Tasks.Extensions.Desktop.dllをBINフォルダーに追加します。この問題は解決するはずです。

更新(3月17日):次のビルド後イベントをプロジェクトに追加することを検討してください。

/ Y "$(SolutionDir)packages\Microsoft.Bcl.Async.1.0.16\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll" "$(TargetDir)Microsoft.Threading.Tasks.Extensions.Desktop .dll」

残念ながら、Bcl.Asyncパッケージの所有者によるこの問題の解決策はまだありません。

3
peleyal

このアプローチでは問題は解決しませんでした-同じランタイムエラーが発生しました。しかし、再構築後、VS2013コンパイラがこの警告を表示したことに気付きました。これは、SOエディタ用に少しフォーマットしました

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1635,5): warning
MSB3247: Found conflicts between different versions of the same dependent Assembly. In Visual 
Studio, double-click this warning (or select it and press Enter) to fix the conflicts; 
otherwise, add the following binding redirects to the "runtime" node in the application 
configuration file:

<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="Microsoft.Threading.Tasks.Extensions.Desktop" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.165.0" newVersion="1.0.165.0" />
    </dependentAssembly>
</assemblyBinding>

そこで、提案されたブロックをアプリのweb.configファイルにドロップしました。その後、アプリは動作することを決めました。なぜそれが機能するのかはわかりませんが、XMLブロックや参照修正がMicrosoft.Threading.Tasks.Extensions.Desktop DLL、または.Net内のいくつかの低レベルの機構に何らかの形で触れたという印象を受けます。または両方。またはどちらも、私が知っているすべてのために。とにかく、あなたの助けに感謝します。私は内部の仕組みをよりよく理解できればいいのにと思います。

2
Frank Solomon