2012-03-22 14 views
0

私は.NETとPowershellの初心者プログラマーです外部からロードされたDLLからpowershellがどのようにタイプ/オブジェクトを返すのですか?

ディレクトリサービスとTSUserExLibを使用してTerminalService属性を取得するコンパイル済みの小さなDLLがあります。 DLLには、 "IADsTSUserEx"を返す静的関数が1つあります。私はDLLをテストし、文字列を返すときに動作しますが、IADsTSUserExクラス\オブジェクト型をpowershellに返すことは可能ですか? PowerShellから静的関数を実行すると、何も戻ってくることはありません。あなたは、あなたの方法は、COMオブジェクトを返すと、PowerShellが直接あなたにそのメソッドやプロパティを公開されていないので

DirectoryEntry user = result.GetDirectoryEntry(); 
       IADsTSUserEx tsuser = (IADsTSUserEx)result.GetDirectoryEntry().NativeObject; 
       return tsuser; 
+1

'[ABC.Class1] :: getTSEntry( "[email protected]")を実行してみてください| Get-Member'を開き、その表示内容を確認します。私はそれが 'getTSEntry'が' $ null'を返すのではなく、 'IADsTSUserEx'オブジェクトをどのように書式化して表示するかをPowerShellが知っていないとは思えません。 – BACON

+0

@BACON、応答ありがとう!私はあなたの提案を試み、次のエラーが表示されます。「Get-Member:get-memberコマンドレットにオブジェクトが指定されていません」存在しないユーザーの例外をトリガーするため、呼び出しが実行されていることがわかります。たとえ文["ABC.Class1] :: getTSEntry(" [email protected] ")-eq $ null"でも返すオブジェクトを処理する方法が分からないと思われます。なし –

+0

前のコメントを編集できませんでしたが、 "[ABC.Class1] :: getTSPath(" [email protected] ")。getType()は、BaseTypeが" System.MarshalByRefObject " __ComObject " –

答えて

0

:私は、DLLは、このコードスニペットが含まれています

Add-Type -Path "c:\temp\test.dll" 
[ABC.Class1]::getTSEntry("[email protected]") 

を次のコマンドを使用して、それを試してみました「反射でそれらにアクセスする必要があるとType.InvokeMember methodでしょう:

$entry = [ABC.Class1]::getTSEntry("[email protected]"); 
$entryType = $entry.GetType(); 
$binder = $null; 
$someMethodParameters = @('Parameter #1', 12345, 'Parameter #3'); 
$someMethodResult = $entryType.InvokeMember('SomeMethod', 'Public, Instance, InvokeMethod', $binder, $entry, $someMethodParameters); 
$somePropertyValue = $entryType.InvokeMember('SomeProperty', 'Public, Instance, GetProperty', $binder, $entry, $null); 
+0

回答ありがとうございます。私はあなたの提案を試みましたが、"基になるRCWから分離されたCOMオブジェクトは使用できません "というエラーが発生しました。これはDirectoryEntry.NativeObjectを意味すると仮定しています。それにもかかわらず、私はちょうど間違ったやり方で、TSUserEXクラス全体を返す代わりに文字列を返すように各プロパティを変換します。 –