Загрузка Google.Apis.dll дает мне исключение StackoverflowException

У меня возникли проблемы с добавлением новых API Google Analytics в надстройку Excel, которую я создаю с помощью ExcelDna.

Я добавил эти Nugets:

  <package id="Google.Apis" version="1.9.3" targetFramework="net45" />
  <package id="Google.Apis.Analytics.v3" version="1.9.2.1160" targetFramework="net45" />
  <package id="Google.Apis.Auth" version="1.9.3" targetFramework="net45" />
  <package id="Google.Apis.Core" version="1.9.3" targetFramework="net45" />

Если я создам класс:

public class Foo {

 public Foo() {
    AnalyticsService bar = null;
 }

}

Как только я пытаюсь создать экземпляр этого класса, я получаю исключение StackoverflowException.

Полагаю, это проблема с загрузкой сборок Google Apis?

Используя FusionLog, я вижу, что Google.Apis.Analytics.v3.dll загружается нормально, но в Google.Apis.DLL есть проблема:

*** Assembly Binder Log Entry  (2015-08-27 @ 14:12:32) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  C:\Program Files\Microsoft Office\Office14\EXCEL.EXE
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: DisplayName = Google.Apis, Version=1.9.2.27817, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab
 (Fully-specified)
LOG: Appbase = file:///C:/Checkouts/NielsBosma/trunk/projects/SeoTools/bin/Debug
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = Excel-DNA: C:\Checkouts\NielsBosma\trunk\projects\SeoTools\bin\Debug\SeoTools64.xll
Calling assembly : Google.Apis.Analytics.v3, Version=1.9.2.116, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Google.Apis, Version=1.9.2.27817, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Checkouts/NielsBosma/trunk/projects/SeoTools/bin/Debug/Google.Apis.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Checkouts\NielsBosma\trunk\projects\SeoTools\bin\Debug\Google.Apis.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Google.Apis, Version=1.9.3.19379, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

Я создал консольное приложение с этими пакетами, где этой проблемы нет.

Теперь я застрял. Что делать дальше?

ОБНОВИТЬ

Я обновил NetOffice и избавился от StackoverflowExeception. Теперь у меня такое исключение:

Could not load file or assembly 'Google.Apis, Version=1.9.2.27817, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

person Niels Bosma    schedule 28.08.2015    source источник
comment
Возможно, в приложении консоли работает перенаправление привязки? Возможно, вы можете установить немного более старые пакеты 1.9.2 для других зависимостей (используя явную -Version в командной строке NuGet).   -  person Govert    schedule 28.08.2015
comment
@govert Да, есть bindingRedirect для System.Net.Http.Primitives, добавленный в app.config с помощью nuget, который, похоже, является проблемой. Я воспроизвел проблему в небольшом решении, используя только ExcelDna и Google Analytics Apis. Консольная версия этого работает. Включен ли файл app.config в xll?   -  person Niels Bosma    schedule 28.08.2015
comment
Вы должны создать свой собственный файл MyAddin.xll.config, который находится рядом с файлом MyAddIn.xll. Я не уверен, что перенаправления привязки из файла .xll.config будут работать. Ваше консольное приложение выдает ту же ошибку, если вы удалите файл .config?   -  person Govert    schedule 28.08.2015
comment
Хорошо, удаление NuGet API Google и его повторное чтение + исправление MyAddin.xll.config решило это. Есть ли способ включить файл конфигурации в xll?   -  person Niels Bosma    schedule 28.08.2015
comment
Если вы запускаете ExcelDnaPack, то файл .xll.config автоматически включается в упакованный .xll. Если есть реальный файл, то он используется вместо запакованного.   -  person Govert    schedule 29.08.2015
comment
@NielsBosma Вы нашли для этого решение? У меня аналогичная проблема! Пожалуйста, поделитесь, если бы вы как-то это сделали!   -  person curiousBoy    schedule 18.12.2015


Ответы (1)


единственное, что вам следовало импортировать, это

PM> Install-Package Google.Apis.Analytics.v3

Я проверил опубликованный вами код, и он не выдает мне ошибки.

 public class Foo
    {

        public Foo()
        {
            AnalyticsService bar = null;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Foo test = new Foo();
        }
    }

Пример Oauth2 с Google Analtyics

/// <summary>
        /// Authenticate to Google Using Oauth2
        /// Documentation https://developers.google.com/accounts/docs/OAuth2
        /// </summary>
        /// <param name="clientId">From Google Developer console https://console.developers.google.com</param>
        /// <param name="clientSecret">From Google Developer console https://console.developers.google.com</param>
        /// <param name="userName">A string used to identify a user.</param>
        /// <returns></returns>
        public static AnalyticsService AuthenticateOauth(string clientId, string clientSecret, string userName)
        {

            string[] scopes = new string[] { AnalyticsService.Scope.Analytics,  // view and manage your analytics data
                                             AnalyticsService.Scope.AnalyticsEdit,  // edit management actives
                                             AnalyticsService.Scope.AnalyticsManageUsers,   // manage users
                                             AnalyticsService.Scope.AnalyticsReadonly};     // View analytics data

            try
            {
                // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
                UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }
                                                                                             , scopes
                                                                                             , userName
                                                                                             , CancellationToken.None
                                                                                             , new FileDataStore("Daimto.GoogleAnalytics.Auth.Store")).Result;

                AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Analytics API Sample",
                });
                return service;
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.InnerException);
                return null;

            }

        }

Код скопирован из учебника по аутентификации Google Analytics API с помощью C #

person DaImTo    schedule 28.08.2015
comment
Как только я пытаюсь создать экземпляр этого класса, я получаю исключение StackoverflowException. Я создал класс, и он не дал мне ошибки. Пожалуйста, опубликуйте пример, показывающий, что происходит ошибка. - person DaImTo; 28.08.2015