2015-08-28 4 views
1

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

Я добавил эти 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. 

Я создал консольное приложение с этими пакетами где эта проблема не существует.

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

UPDATE

Я обновил 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) 
+0

Есть ли возможно связывание перенаправлять в приложение консоли, которая работает? Возможно, вы можете установить несколько более старые пакеты 1.9.2 для других зависимостей (используя явное -Version в командной строке NuGet). – Govert

+0

@govert Да, есть привязкаRedirect для «System.Net.Http.Primitives», добавленная в app.config от nuget, которая, похоже, является проблемой. Я воспроизвел проблему в небольшом решении только с ExcelDna и Google Analytics Apis. Это подтверждается консолью. Является ли приложение app.config включенным в xll? –

+1

Вы должны создать собственный файл MyAddin.xll.config, расположенный рядом с файлом MyAddIn.xll. Я не уверен, будут ли связаны переадресации с файла .xll.config. Получает ли ваше консольное приложение ту же ошибку, если вы удалите файл .config? – Govert

ответ

0

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

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 Authentication with C# tutorial

+0

Если вы прочитали мой вопрос, это все, что я получил. –

+1

«Как только я пытаюсь создать экземпляр этого класса, я получаю исключение StackoverflowException.«Я создал класс, и он не дал мне ошибку. Отправьте пример, показывающий ошибку. – DaImTo