'DotNetOpenAuth.Logger'的类型初始化程序引发了异常

时间:2013-10-13 10:08:31

标签: powershell dotnetopenauth google-api-dotnet-client

我的目标是从PowerShell调用Google Admin SDK目录更新。我开始使用一个有效的.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以防止错误:

  

&#34;无法加载文件或程序集&System; Net.Net.Http.Primitives,   Version = 1.5.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a&#39;要么   其中一个依赖项。系统找不到指定的文件。&#34;

这远非理想。

修改

PowerShell-calling-my-DLL版本的InnerException是:

  

无法加载文件或程序集&#39; log4net,版本= 1.2.10.0,   Culture = neutral,PublicKeyToken = 1b44e1d426115821&#39;或其中一个   依赖。系统找不到指定的文件。

需要花一点时间才能找到innerException。我周围有一点雪貂,发现使用Fuslogvw的建议,所以我试过了。我关闭并重新打开PowerShell,启动了Fusion Log Viewer(这是我第一次使用它)并找到了log4net的三个条目。描述如下:

  • log4net的
  • log4net,Version = 1.2.12.0,Culture = neutral,PublicKeyToken = 669e0ddf0bb1aa2a
  • log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821

当我打开它们时,前两个有&#39;操作成功。&#39;作为第二行文字。第三个操作&#39;操作失败。绑定结果:hr = 0x80070002。系统找不到指定的文件。&#39;

当我深入研究该日志时,我发现:

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输出中没有任何内容表明存在问题。

1 个答案:

答案 0 :(得分:0)

事实证明,具有不同PublicKeyTokens的两个版本的log4net已经导致其他版本的问题。我已经通过向GAC添加了一个带有Public4eyToken = 1b44e1d426115821的log4net的verison并将另一个bindingredirect添加到配置文件,因为版本不匹配。

您可以找到log4net版本here。您将看到对oldkey和newkey版本的引用。 oldkey有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>

到配置文件中的assemblyBinding。