3

この質問を要約で紹介する方法に途方に暮れているので、説明ですぐに飛び込みます。

現在、さまざまな powershell コマンドの実行に依存する C# アプリケーションにいくつかの機能を実装しています。正確には、Windows Server 2012 の iSCSI ターゲット機能からサーバー ターゲットのリストを取得しようとしています。

PS コマンドはGet-IscsiServerTargetで、例として次の出力を返します。

Id : Server0.contoso.local:SQLTarget
TargetName : SQLTarget
TargetIqn : iqn.1991-05.com.microsoft:server0-sqltarget-target
説明 :
有効:真
ステータス:アイドル
最終ログイン: 1600/12/31 16:00:00
EnableChap : 偽
EnableReverseChap : 偽
コンピューター名: Server0.contoso.local
MaxReceiveDataSegmentLength : 65536
FirstBurstLength : 65536
MaxBurstLength : 262144
受信バッファ数: 10
EnforceIdleTimeoutDetection : True
InitiatorIds: {IPAddress:10.1.1.3}
LunMappings : {TargetName:SQLTarget;WTD:2;LUN:0}
バージョン: 3.3.16543
ServerInfo : Server0.contoso.local

パイプラインでコマンドを呼び出した後に返される PSObject コレクションは、Microsoft.Iscsi.Target.Commands.IscsiServerTargetオブジェクトのコレクションです。プリミティブ型であるすべてのプロパティにアクセスできるので、これはまったく問題ありません。私の問題は、LunMappingsのタイプがMicrosoft.Iscsi.Target.Commands.LunMappingであり、この特定のオブジェクトのプロパティにアクセスする方法が見つからないことです。

プロパティで ToString() を呼び出すと、"Microsoft.Iscsi.Target.Commands.LunMapping[]" に等しい文字列が返されますが、これは明らかに私が望んでいるものではありません。

心の中でやりたいことは

psobject[index].Properties["LunMappings"].Properties["Lun"]

また

((Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"]).Lun

必要なアセンブリへの参照を配置した後、最後のものを試しましたが、コンパイル エラーが発生しました。

ガイダンス、指示、または建設的なコメントをいただければ幸いです。

編集 プロジェクトで Microsoft.Iscsi.Target.Commands.dll への参照を配置して、PSObject のキャストを許可する((Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"]).Lunと、コンパイル エラーが発生します - Error 4 The type or namespace name 'Iscsi' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?).

編集

この問題は現在修正されています。最初の編集でキャストしようとしたときに言及されたエラー 4 の問題は、プロジェクトが 3.5 フレームワークを対象としており、参照されているアセンブリに 4.0 が必要であるためです。これで、オブジェクトを正常にキャストできます。

4

2 に答える 2

0

LunMappingsプロパティはオブジェクトの配列あるLunMappingため、最初にその配列型にキャストする必要があります。それが完了したら、配列のインデックスにアクセスする必要があり、その時点で.Lunプロパティにアクセスできます

var arr = (Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"];
arr[0].Lun;
于 2013-07-02T22:31:41.447 に答える
0

プロパティで ToString() を呼び出すと、"Microsoft.Iscsi.Target.Commands.LunMapping[]" に等しい文字列が返されます。これは明らかに私が望んでいるものではありません。

ToString を呼び出す代わりに、Microsoft.Iscsi.Target.Commands.LunMapping[] にキャストします。

// obj is the thing than you used to call ToString() on that retuned
// "Microsoft.Iscsi.Target.Commands.LunMapping[]
var mappings = (Microsoft.Iscsi.Target.Commands.LunMapping[])obj;
// Check the length of the array and read the index 
// you are interested in instead of 0
int myLun = mappings[0].Lun;

コンパイラエラーに関するコメントに対処するためだけに:

ここに画像の説明を入力

正しく参照されている場合、エラーは発生しません。すべてを再確認してください。あなたが伝えていないセットアップに何か問題があります。写真でわかるように、キャストは問題なくコンパイルされます。

アセンブリを参照した場合でもエラーが発生する理由はいくつかあります。たとえば、ここここを参照してください。

于 2013-07-02T22:45:04.383 に答える