我试图编写一个PowerShell脚本,它将通过反射调用某个DLL(MyClass
)中包含的静态类(MyNamespace.MyLibrary.dll
)中的一系列静态方法。但是,即使在该库中调用最简单的方法(MyNamespace.MyLibrary.MyClass.CallMe()
)也会失败,并显示以下错误消息:
Exception calling "CallMe" with "0" argument(s): "The type initializer for 'MyNamespace.MyLibrary.MyClass' threw an exception."
At C:\temp\powershellTest.ps1:41 char:1
+ $output = [MyNamespace.MyLibrary.MyClass...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : TypeInitializationException
第一件奇怪的事情是,当我尝试在 static 类中调用 static 方法时,我遇到了类型初始化(构造函数?)错误。 / p>
拨打电话的PowerShell代码:
[reflection.assembly]::LoadFile($dllLocation + 'MyNamespace.MyLibrary.dll')
$output = [MyNamespace.MyLibrary.MyClass]::CallMe()
Write-Host $output
相关的C#代码:
namespace MyNamespace.MyLibrary
{
public static class MyClass
{
public static string CallMe() // the CallMe() method was added just to try to debug this
{
return "I was called";
}
}
}
现在,这个特定的库要大得多,并且具有很多依赖性,所有这些都在MyClass
中的其他方法中使用。我创建了另一个DLL,它尽可能简单(无外部依赖)来测试我的PowerShell反射,并成功调用静态类'方法(显然也是静态的)。这告诉我,我的powershell是正确的,所以我查找了为什么我可能会遇到这个问题。 This comment表示可能无法自动加载所有MyNamespace.MyLibrary
个引用。
我尝试了两件事来解决这个问题:
我将MyLibrary
引用的所有非GACed DLL复制到同一个文件夹中,以便它们与MyLibrary.dll并排
当这样做不起作用时,我还在[reflection.assembly]::LoadFile(path\otherAssembly.dll)
之后添加了明确的MyNamespace.MyLibrary.dll
行,以确保powershell可以加载它们。这也没有用。
以下是我的主要问题:如何获取更具体的错误消息哪些依赖关系未被发现,可能在哪里&# 39;看?当尝试修复#1不够时,我感到很震惊,我不确定我还能做些什么。
我希望这是有道理的;随时提出任何必要的澄清问题。谢谢!
答案 0 :(得分:1)
这将为您提供例外情况:
try
{
[reflection.assembly]::LoadFile($dllLocation + 'MyNamespace.MyLibrary.dll')
$output = [MyNamespace.MyLibrary.MyClass]::CallMe()
Write-Host $output
}
catch [Exception]
{
echo $_.Exception.GetType().FullName, $_.Exception.Message
}