【问题标题】:How to invoke a DLL method from PowerShell 1.0 [closed]如何从 PowerShell 1.0 调用 DLL 方法 [关闭]
【发布时间】:2013-08-09 17:38:06
【问题描述】:

我正在使用 PowerShell 1.0 版脚本从 DLL 文件中调用方法,并使用以下代码将 DLL 文件加载到 PowerShell 中。

[System.Reflection.Assembly]::LoadFile("path of dll") is loaded successfully

GAC    Version        Location
---    -------        --------
False  v2.0.50727     location of dll

该类包含一个公共默认构造函数。我尝试使用以下代码创建该类的对象:

$obj = new-object namespce.classname

它会抛出以下错误:

New-Object:使用“0”参数调用“.ctor”的异常:“'namespce.classname' 的类型初始化程序引发了异常。”
在 line:1 char:18
+ $obj = 新对象 + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand`

当我尝试在不创建对象的情况下调用类的方法时,即使该类包含该方法,它也会抛出以下错误:

PS C:\Windows\system32> [namespace.classname]::method()
Method invocation failed because [namespace.classname] doesn't contain a method named 'method'.
At line:1 char:39
+ [namespace.classname]::method <<<< ()
    + CategoryInfo          : InvalidOperation: (method:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

这是一个版本错误,通常是 DLL 版本问题。 Dot NET 不允许卸载,对于 powershell 也是如此。因此,重新启动将重新开始,并进行修复。只需确保版本没有歧义,即可避免同样的问题。

【问题讨论】:

  • 为了成功,method() 需要是静态的。您可以发布相关方法的签名吗?例如公共静态字符串 foo(int bar){}
  • 嗨,MathewMartin,它的返回类型为 void 的公共方法()。公共无效方法()

标签: .net windows powershell


【解决方案1】:

该方法很可能是一个实例方法,这意味着您将需要一个该类的实例。您可以通过类上的公共默认构造函数来获得它,例如:

$obj = new-object namespace.classname
$obj.Method()

也许是唯一的公共构造函数的 require 参数,例如:

$obj = new-object namespace.classname -arg 'string_arg',7
$obj.Method()

或者可能没有公共构造函数,但有一个返回实例的静态 Create 或 Parse 方法,例如:

$obj = [namespace.classname]::Create()
$obj.Method()

【讨论】:

  • 嗨 Keith Hill,实际上我尝试了上述方法来创建对象以及公共默认构造函数,所以我尝试使用以下代码创建对象 $obj = new-object namespace.classname 和它抛出以下错误。 ` New-Object : 使用“0”参数调用“.ctor”的异常:“'classname.method' 的类型初始化程序引发了一个异常。”在 line:1 char:18 + $obj = new-object
  • 类型初始化器是静态构造器。如果这失败了,很可能是您加载的程序集需要您尚未加载的另一个程序集的类型。使用 ILDasm(附带 .NET SDK)或获取免费工具(如 dotPeek)打开程序集并查看它引用的其他程序集。您将需要加载尚未加载到 PowerShell 进程中的那些。
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
相关资源
最近更新 更多