จะส่งวัตถุตามประเภทจาก C # ไปยัง VBScript ได้อย่างถูกต้องได้อย่างไร

จะส่งวัตถุ C # ไปยัง VBScript ได้อย่างไร

คลาส C # ของฉันที่ฉันต้องการคืนคือ:

namespace GSM
{

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

    }
}

ฉันเคยค้นหาเว็บไซต์หลายแห่งใน Google และส่วนใหญ่แนะนำให้ส่ง object[] เป็นค่าส่งคืน C# ในกรณีนี้ VBScript จะวนซ้ำและกำหนดประเภทและค่าของวัตถุใหม่ให้ดี ตัวอย่างเช่น ฟังก์ชันที่ส่งคืนจะเป็นดังนี้:

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;     
        }

และ VBScript ซึ่งทำงานได้ดี:

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

ในกรณีนี้ จะแสดงข้อความสามข้อความ: ParseResult, GSM.ParseResult และ OK

แต่เมื่อฉันพยายามเปลี่ยนฟังก์ชั่นของฉันเป็น

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

                return parseResult;     
            }

และพยายามเรียกมันใน VBScript ด้วยโค้ด

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

ข้อความจะเป็น: String, GSM.ParseResult และข้อความเกี่ยวกับข้อยกเว้นพร้อมรหัส 800A01A8 สำหรับบรรทัด Wscript.Echo a.Status

เหตุใด VBScript จึงจำประเภทของวัตถุที่ส่งคืนเป็น String และไม่ใช่เป็นประเภทคลาสของฉัน หากวัตถุถูกส่งคืนโดยตรง แต่กำหนดประเภทใหม่เป็น ParseResult หากค่าที่ส่งคืนถูกห่อเป็น object[]

จะบังคับให้ VBScript จดจำประเภทของวัตถุที่ส่งคืนเป็น ParseResult โดยไม่ต้องล้อมไว้ใน object[] ได้อย่างไร

ขอบคุณ!


person Arthur    schedule 27.04.2018    source แหล่งที่มา
comment
ทำไมคุณไม่ใช้ ClassInterfaceType.AutoDual หรือ ClassInterfaceType.AutoDispatch สำหรับชั้นเรียนของคุณ?   -  person xxbbcc    schedule 27.04.2018
comment
จะเกิดอะไรขึ้นถ้าคุณทำ Set a = o.Parse(...) แทนที่จะเป็น a = o.Parse(...)   -  person Michael Gunter    schedule 27.04.2018
comment
ฉันได้ลองทั้งสองแล้ว แต่การเปลี่ยนแปลงเหล่านั้นไม่สามารถแก้ปัญหาได้...   -  person Arthur    schedule 27.04.2018
comment
Michael Gunter คุณคือผู้ประหยัดเวลาของฉัน! ขอบคุณมาก! คุณสามารถทำให้มันเป็นคำตอบสำหรับคำถามนี้ได้หรือไม่?   -  person Arthur    schedule 27.04.2018


คำตอบ (1)


คุณจะต้องเตะตัวเองในเรื่องนี้ แต่คุณเพียงแค่ต้องใช้ Set a = o.Parse(...) แทน a = o.Parse(...)

สำหรับผู้ที่สงสัยว่าทำไม: a = o.Parse(...) จึงเป็น Let a = o.Parse(...) โดยปริยาย Let ถูกใช้เมื่อกำหนดค่า และใช้ Set เมื่อกำหนดออบเจ็กต์ เมื่อใช้ Let เพื่อกำหนดวัตถุ จะเป็นการแปลงวัตถุให้เป็นค่า ฉันจำกลไกนี้ไม่ได้ แต่อาจใช้เทคนิค COM มาตรฐานที่เกี่ยวข้องกับสิ่งต่าง ๆ เช่น IDispatch และ DISPID_VALUE. เมื่อมีการเรียกใช้การแปลงนี้ บางอย่างในกรอบงาน .NET กำลังส่งคืน ProgID หรือ .NET Namespace.ClassName แบบเต็มของออบเจ็กต์ของคุณ

person Michael Gunter    schedule 27.04.2018
comment
หากไม่มีการตั้งค่าจะพยายามใช้ค่าเริ่มต้นของวัตถุแทนการอ้างอิงวัตถุ มันไม่มีเลย คาบูม ความคลุมเครือของไวยากรณ์ได้รับการแก้ไขใน vb.net คุณสมบัติเริ่มต้นจะต้องเป็นคุณสมบัติที่จัดทำดัชนีไว้เสมอ - person Hans Passant; 29.04.2018