4

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 : ".ctor" を "0" 引数で呼び出し中に例外が発生しました: "'namespce.classname' の型初期化子が例外をスローしました。"
行:1 char:18
+ $obj = new-object <<<< namespce.classname
+ 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 のバージョンの問題です。ドット NET ではアンロードが許可されず、powershell でも同じです。したがって、再起動すると最初からやり直され、修正も行われます。バージョンがあいまいにならないようにして、同じ問題を回避してください。

4

1 に答える 1

3

ほとんどの場合、メソッドはインスタンス メソッドです。これは、クラスのインスタンスが必要になることを意味します。クラスのパブリックデフォルトコンストラクターを介してそれを取得できます。

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

おそらく、唯一のパブリック コンストラクターの必須パラメーターは次のとおりです。

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

または、パブリック コンストラクターがなくても、インスタンスを返す静的な Create または Parse メソッドがある可能性があります。

$obj = [namespace.classname]::Create()
$obj.Method()
于 2013-08-10T20:10:11.897 に答える