Ошибка приложения ASP.net - Не удалось загрузить файл или сборку "Microsoft.Threading.Tasks.Extensions.Desktop"
Я хочу создать приложение ASP.NET Google BigQuery С# с использованием OAuth2 и рамки .Net 4.5. Я запустил эти установки 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.
APIS & auth -> Credentials -> CREATE NEW CLIENT ID
и я убедился, что добавил этот файл (client_secrets.json) в проводник решений в VS2013. В коде, я убедился, что я правильно сопоставлен с файлом client_secrets с Server.MapPath. Для машинного удостоверения я использовал этот код
<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" или одна из его зависимостей. Система не может найти указанный файл.
и сбой в строке "credential =" . Я попытался добавить некоторые изображения фактической страницы с разбивкой браузера ASP.net, показывающей трассировку загрузки загрузки/трассировку стека/и т.д., Но похоже, что у меня нет прав учетной записи для этого. Когда я устанавливаю точку останова на строке "credential =" , а затем запускаю приложение через
DEBUG -> Start Debugging
в VS2013, страница останавливается в строке "credential =" и открывается сборщик файлов, ища файл
"GoogleClientSecrets.cs"
из каталога
"C:\код\google.com\Google-Апи-Dotnet-клиент\умолчанию\Tools\Google.Apis.Release\Bin\Debug\вывода\умолчанию\Src\GoogleApis.Auth\OAuth2\GoogleClientSecrets.cs"
который нигде не находится на диске. Используя трассировку загрузки сборки на сгенерированной странице ошибок ASP.net, я попытался выполнить поиск в предлагаемых файлах конфигурации, но ничего не получилось. В более общем плане, я попытался найти эту проблему в StackOverflow, и, хотя я действительно об этом упоминал, ни один из этих материалов не помог.
Ответы
Ответ 1
Поскольку ошибка основана на том, что последняя версия Microsoft.Bcl.Async не работает в .NET 4.5, вы можете попробовать сделать следующее:
Откройте консоль диспетчера пакетов и выполните следующие команды:
1) Uninstall-Package Microsoft.Bcl.Async -Force
2) Install-Package Microsoft.Bcl.Async -Version 1.0.16
Он работает в образце, который я сейчас пишу. Пожалуйста, дайте мне знать, если это сработает для вас.
ОБНОВЛЕНИЕ (21 марта):
Вы можете обновить пакет (доступна новая версия 1.0.166-бета - https://www.nuget.org/packages/Microsoft.Bcl.Async/1.0.166-beta).
Я тестировал его на VS2013 с помощью платформы .NET 4.5, и он работает.
Ответ 2
Они выпустили новую версию -Package Microsoft.Bcl.Async.
Если у кого-то есть эта проблема, установите версию "последняя" вместо 1.0.16.
Я надеюсь, что это сработает для вас.
Ответ 3
Я уже встречал эту ошибку раньше. Похоже, что пакет Bcl.Async содержит ссылку на Microsoft.Threading.Tasks.Extensions.Desktop при запуске приложений .NET 4.0, но так или иначе отсутствует в приложении .NET 4.5.
Мой совет для вас (пока я не буду считать нашего с владельцем Microsoft.Bcl.Async, почему это происходит) заключается в копировании Microsoft.Threading.Tasks.Extensions.Desktop из пакетов \Microsoft.Bcl.Async.1.0. 165\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll в папку BIN. Он должен решить эту проблему.
ОБНОВЛЕНИЕ (17 марта):
Подумайте о добавлении в проект следующего события Post-build:
copy/Y "$ (SolutionDir) пакеты \Microsoft.Bcl.Async.1.0.16\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll" "$ (TargetDir) Microsoft.Threading.Tasks. Extensions.Desktop.dll"
К сожалению, еще нет решения этой проблемы у владельцев пакета Bcl.Async.
Ответ 4
Этот подход не устранил проблему - я получил ту же ошибку времени выполнения. Но после перекомпоновки я заметил, что компилятор 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 или некоторые низкоуровневые механизмы внутри .Net, или оба. Или ни того, ни другого. В любом случае, спасибо за вашу помощь. Мне только хотелось бы, чтобы я лучше понял внутреннюю технику.