Bagaimana cara meneruskan objek berdasarkan tipe dengan benar dari C# ke VBScript?

Bagaimana cara meneruskan objek C# ke VBScript?

Kelas C# saya, yang ingin saya kembalikan adalah:

namespace GSM
{

    [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E125E")]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("GSM.ParseResult")]
    public class ParseResult
    {
        public string Status;
        public HtmlNode table;

    }
}

Saya telah mencari banyak situs di Google dan kebanyakan dari mereka merekomendasikan untuk meneruskan object[] sebagai nilai pengembalian C#. Dalam hal ini VBScript mengulangi dan mengenali tipe dan nilai objek dengan baik. Misalnya, fungsi yang mengembalikannya adalah seperti ini:

public object[] Parse(string userid, string password, string startDate, string endDate)
        {
            ParseResult parseResult = new ParseResult();
            parseResult.Status="OK";   

            object o = (object)parseResult;
            object[] oa = new object[] { o };
            return oa;     
        }

dan VBScript, yang berfungsi dengan baik:

Dim o
Set o = CreateObject("1C_GSM.TestComClass")
Dim a
a = o.Parse("51597", "********", "01-03-2017", "31-03-2017")
For Each entry In a
                Wscript.Echo TypeName(entry)
                Wscript.Echo entry
                Wscript.Echo entry.Status
Next

Dalam hal ini tiga pesan akan ditampilkan: ParseResult, GSM.ParseResult dan OK.

Tetapi ketika saya mencoba mengubah fungsi saya menjadi

public ParseResult Parse(string userid, string password, string startDate, string endDate)
            {
                ParseResult parseResult = new ParseResult();
                parseResult.Status="OK"; 

                return parseResult;     
            }

dan mencoba memanggilnya dalam VBScript dengan kode

Dim o
Set o = CreateObject("1C_GSM.TestComClass")
Dim a
a = o.Parse("51597", "********", "01-03-2017", "31-03-2017")
Wscript.Echo TypeName(a)
Wscript.Echo a
Wscript.Echo a.Status

pesan yang akan dikirim adalah: String, GSM.ParseResult dan pesan tentang pengecualian dengan kode 800A01A8 untuk baris Wscript.Echo a.Status.

Mengapa VBScript mengenali tipe objek yang dikembalikan sebagai String, dan tidak sebagai tipe kelas saya, jika objek dikembalikan secara langsung, tetapi mengenali tipe sebagai ParseResult, jika nilai yang dikembalikan digabungkan menjadi object[]?

Bagaimana cara memaksa VBScript mengenali tipe objek yang dikembalikan sebagai ParseResult tanpa membungkusnya ke dalam object[]?

Terima kasih!


person Arthur    schedule 27.04.2018    source sumber
comment
Mengapa Anda tidak menggunakan ClassInterfaceType.AutoDual atau ClassInterfaceType.AutoDispatch untuk kelas Anda?   -  person xxbbcc    schedule 27.04.2018
comment
Apa yang terjadi jika Anda melakukan Set a = o.Parse(...) dan bukannya a = o.Parse(...)?   -  person Michael Gunter    schedule 27.04.2018
comment
Saya sudah mencoba keduanya, tetapi perubahan tersebut tidak menyelesaikan masalah...   -  person Arthur    schedule 27.04.2018
comment
Michael Gunter, kamu adalah penghemat waktuku! Terima kasih banyak! Bisakah Anda menjadikannya sebagai jawaban atas pertanyaan ini?   -  person Arthur    schedule 27.04.2018


Jawaban (1)


Anda akan menyalahkan diri sendiri untuk ini, tetapi Anda hanya perlu menggunakan Set a = o.Parse(...) alih-alih a = o.Parse(...).

Bagi mereka yang bertanya-tanya mengapa: a = o.Parse(...) secara implisit adalah Let a = o.Parse(...). Let digunakan saat menetapkan nilai, dan Set digunakan saat menetapkan objek. Saat menggunakan Let untuk menetapkan objek, itu akan mengubah objek menjadi nilai. Saya tidak ingat mekanismenya, tetapi mungkin menggunakan teknik COM standar yang melibatkan hal-hal seperti IDispatch dan DISPID_VALUE. Saat konversi ini dipanggil, sesuatu dalam kerangka .NET mengembalikan ProgID atau .NET Namespace.ClassName lengkap dari objek Anda.

person Michael Gunter    schedule 27.04.2018
comment
Tanpa Set, ia akan mencoba menggunakan nilai default objek alih-alih referensi objek. Tidak ada, kaboom. Ambiguitas sintaksis telah diperbaiki di vb.net, properti Default harus selalu berupa properti yang diindeks. - person Hans Passant; 29.04.2018