无法调用反映的DLL中的方法。如何获得更好的错误消息?

时间:2015-08-27 02:34:17

标签: c# powershell reflection

我试图编写一个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个引用。

我尝试了两件事来解决这个问题:

  1. 我将MyLibrary引用的所有非GACed DLL复制到同一个文件夹中,以便它们与MyLibrary.dll并排

  2. 当这样做不起作用时,我还在[reflection.assembly]::LoadFile(path\otherAssembly.dll)之后添加了明确的MyNamespace.MyLibrary.dll行,以确保powershell可以加载它们。这也没有用。

  3. 以下是我的主要问题:如何获取更具体的错误消息哪些依赖关系未被发现,可能在哪里&# 39;看?当尝试修复#1不够时,我感到很震惊,我不确定我还能做些什么。

    我希望这是有道理的;随时提出任何必要的澄清问题。谢谢!

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
}