0

カスタムメイドのc#.DLLをPowerShellに統合するプロジェクトに取り組んでいます。ただし、PowerShellが理解できない形式にC#オブジェクトをキャストする際に問題が発生します。私は何百万回もグーグルを検索し、いくつかの異なることを試みましたが、どれも成功しませんでした。

オブジェクトの配列を使用してSNC-getVlanを呼び出すと、次のエラーが発生します。

"引数"1"で"printObject"を呼び出す際の例外:"タイプ'System.Management.Automation.PSObject'のオブジェクトをタイプ'Objects.blablazzz.DC_Object'にキャストできません"

私のコードの小さなサブセットを投稿して、私が間違っていることを皆さんに見てもらいたいと思っています。

私が使用しているクラス:

public class DC_Object
{
    public string name = "undefined";
}

public class Cmdb_Host : DC_Object
{
    //Lots of properties
}

public class Cmdb_Vlan : DC_Object
{
    //Lots of properties
}

オブジェクトを印刷する関数:

public static void printObject(Object[] objects)
{
    foreach (Object o in objects)
    {
        string name = ((DC_Object)o).name; //I'm assuimg things go wrong in here.

fromJSON関数は、printObjectに送信されたオブジェクトを実際に返す関数です。重要かどうかはわかりませんが、とにかく投稿します。

static public Object[] fromJSON(string input)
{
    //Check the string to see to what object it should convert to
    switch (input.Substring(0, 16))
    {
        //Reuest for a host (Host Table)
        case "{\"u_cmdb_ci_host":
            if (input[18] == '[') // We have an array
            {
                Container_Host c_host = JsonConvert.DeserializeObject<Container_Host>(input);
                return c_host.u_cmdb_ci_host;
            }
            else    // We have a single object
            {
                Container_Host_Single c_host = JsonConvert.DeserializeObject<Container_Host_Single>(input);
                Container_Host h = new Container_Host();
                h.u_cmdb_ci_host = new Cmdb_Host[1];
                h.u_cmdb_ci_host[0] = c_host.u_cmdb_ci_host;
                return h.u_cmdb_ci_host;
            }
        //Request for a VLAN (Network Table)
        case "{\"cmdb_ci_ip_net":
            Container_Vlan c_vlan = JsonConvert.DeserializeObject<Container_Vlan>(input);
            return c_vlan.cmdb_ci_ip_network;
    }

    return null;
}

Powershellモジュール/スクリプト:

#Loads in the custom DLL created for this specific project.
[Reflection.Assembly]::LoadFrom(“C:\Users\Joey\Documents\PSScripts\DataCollector\DataCollect.dll”)

# Creates a new Client object that handles all communication between the PowerShell module and the
# sncdb-worker at server side.
$client = new-object blablazzz.Sender;
[blablazzz.Config]::Configure("C:\Users\Joey\Documents\PSScripts\DataCollector\asp4all.ini")
$client.Connect();

# This functions returns a Host Machine (Virtual or Physical) in object notation to    for easy post-processing
# in PowerShell. 
Function SNC-GetHost($hostz = "blabla")
{
    return $client.sendMessage([blablazzz.Parser]::getHost($hostz));    
}

# This function returns VLAN information in object notation. This is a collection most     of the time.
function SNC-GetVLAN($vlan = "TLS-TL2-CPH-TEST")
{
    return $client.sendMessage([blablazzz.Parser]::getVlan($vlan));
}
Function printObject($hostz)
{
    [blablazzz.Formatter]::printObject($hostz)
}

PowerShellコマンド(dllは既にロードされています):

PS C:\$variable = SNC-Get-VLAN
PS C:\printObject($variable)

printDebug関数はSNC-getHostで使用すると正常に機能しますが、SNC-getVlanでは機能しないことに注意する必要があります。SNC-Get-Vlanは値の配列を返しますが、SNC-getHostは1つの値のみを返します(まだただし、配列ですが、PowerShellが配列に保持しているようには見えません)。

4

1 に答える 1

0

同じ問題に遭遇するかもしれない人々のために。解決策は、関数の戻り値とDC_Objectへの引数を変更することでした。これは、これが最上位のカプセル化オブジェクトであるためです。これにより、すべてのキャストの問題が解決しました。

于 2012-08-14T06:15:35.250 に答える