Инициализатор типа для «DotNetOpenAuth.Logger» вызвал исключение

Моя цель — вызвать обновления каталога Google Admin SDK из PowerShell. Я начал с работающего приложения .NET и преобразовал его в библиотеку классов (которую я протестировал - она ​​работает). Я загружаю это в манифест модуля с помощью

RequiredAssemblies = @('My.GoogleAdminSDK.Directory.dll')

Моя функция Get-GoogleSDKUser New-Objects мой класс и вызывает для него GetUser. И я получаю:

Exception calling "GetUser" with "1" argument(s): "The type initializer for 
'DotNetOpenAuth.Logger' threw an exception."
At C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\My.googleadminsdkdirectory.admin\My.GoogleA
dminSDKDirectory.Admin.psm1:56 char:9
+         $service.GetUser($googleUserName)
+         ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : TypeInitializationException

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

Примечание: чтобы зайти так далеко, мне пришлось добавить

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.12.0" newVersion="1.2.12.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

в powershell_ise.exe.config, чтобы предотвратить ошибку:

«Не удалось загрузить файл или сборку «System.Net.Http.Primitives, версия = 1.5.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a» или одна из ее зависимостей. Система не может найти указанный файл».

что далеко от идеала.

ИЗМЕНИТЬ

InnerException для версии PowerShell-calling-my-DLL:

Не удалось загрузить файл или сборку «log4net, версия = 1.2.10.0, культура = нейтральная, PublicKeyToken = 1b44e1d426115821» или одну из ее зависимостей. Система не может найти указанный файл.

Потребовалось немного покопаться, чтобы найти innerException. У меня было немного хорька, и я нашел предложения использовать Fuslogvw, поэтому я попробовал это. Я закрыл и снова открыл PowerShell, запустил Fusion Log Viewer (я использовал его впервые) и нашел три записи для log4net. Описания:

  • log4net
  • log4net, версия = 1.2.12.0, культура = нейтральная, PublicKeyToken = 669e0ddf0bb1aa2a
  • log4net, версия = 1.2.10.0, культура = нейтральная, PublicKeyToken = 1b44e1d426115821

Когда я их открываю, на первых двух написано: «Операция прошла успешно». в качестве второй строки текста. У третьего «Операция не удалась». Результат привязки: hr = 0x80070002. Система не может найти указанный файл.'

Когда я копаюсь в этом журнале, я нахожу:

LOG: Assembly download was successful. Attempting setup of file: C:\windows\system32\windowspowershell\v1.0\Modules\JLP.GoogleAdminSDKDirectory.Admin\log4net.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
WRN: Comparing the assembly name resulted in the mismatch: Build Number
ERR: The assembly reference did not match the assembly definition found.

Я снова попытался запустить его из Visual Studio. В fuslogvw также было три записи, и в третьей была такая же ошибка. Но в выводе VS нет ничего, что указывало бы на проблему.


person user2871239    schedule 13.10.2013    source источник
comment
Вы должны увидеть внутреннее исключение, вызвавшее исключение инициализатора типа. Это будет иметь больше информации о том, что происходит не так.   -  person Jon Skeet    schedule 13.10.2013
comment
Спасибо. innerException показывает, что он не может загрузить файл, потому что версия отличается, а перенаправление сборки в файле конфигурации предназначено для другого PublicKeyToken. Нормально ли менять это для каждой версии? Есть ли способ обойти это?   -  person user2871239    schedule 13.10.2013
comment
Я не эксперт в этом, но думаю, похоже, что автор изменил ключ, который они используют для подписи. Я предлагаю вам посмотреть, сможете ли вы получить правильную оригинальную версию.   -  person Jon Skeet    schedule 13.10.2013
comment
Действительно есть. Фактически, они поддерживают оба ключа. Спасибо, что указали мне правильное направление.   -  person user2871239    schedule 14.10.2013


Ответы (1)


Оказывается, две версии log4net с разными PublicKeyToken вызвали проблемы у других. Я заработал, добавив версию log4netwith PublicKeyToken=1b44e1d426115821 в GAC и добавив еще одно перенаправление привязки в файл конфигурации, поскольку версии не совпадают.

Вы можете найти версии log4net здесь. Вы увидите ссылки на версии oldkey и newkey. У старого ключа есть PublicKeyToken=1b44e1d426115821, поэтому я просто запустил

gacutil /i "C:\Users\Me\Downloads\log4net\log4net-1.2.12-bin-oldkey\log4net-1.2.12\b
in\net\4.0\release\log4net.dll"

чтобы засунуть его в GAC и добавил:

<dependentAssembly>
  <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-1.2.12.0" newVersion="1.2.12.0" />
</dependentAssembly>

к AssemblyBindings в файле конфигурации.

person user2871239    schedule 13.10.2013