我的目的是从PowerShell调用Google Admin SDK目录更新。我从一个可运行的.NET应用程序开始,然后将其转换为一个类库(经过我的测试-它可以工作)。我将其加载到模块 list 中

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以防止错误:



这远非理想。

编辑

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



花费了一些时间才能找到innerException。我到处都是雪貂,找到了使用Fuslogvw的建议,所以我尝试了一下。我关闭并重新打开PowerShell,启动Fusion Log Viewer(这是我第一次使用它),并找到了log4net的三个条目。描述为:
  • log4net
  • log4net,版本= 1.2.12.0,文化=中性,PublicKeyToken = 669e0ddf0bb1aa2a
  • log4net,版本= 1.2.10.0,文化=中性,PublicKeyToken = 1b44e1d426115821

  • 当我打开它们时,前两个显示“操作成功”。作为文本的第二行。第三是“操作失败。绑定(bind)结果: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输出中没有任何东西可以指示问题。

    最佳答案

    事实证明,具有不同PublicKeyTokens的两个版本的log4net导致了其他问题。我通过将带有PublicKeyToken = 1b44e1d426115821的log4net版本添加到GAC并由于配置不匹配而向配置文件添加了另一个bindingredirect来使其工作。

    您可以找到log4net版本here。您将看到对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。

    关于powershell - 'DotNetOpenAuth.Logger'的类型初始值设定项引发了异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19343991/

    10-15 20:12