我的目标是从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的三个条目。描述如下:
当我打开它们时,前两个有&#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输出中没有任何内容表明存在问题。
答案 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。