如何从VB6.0中的.NET COM可见dll获取Json字段值的值

问题描述

我有一个可用于Web服务的C#COM可见DLL。该COM可见DLL在VB6应用程序中被引用和使用。 COM可见的DLL具有从Web服务调用提取数据并以Json格式获取数据的功能,然后还将Json文档反序列化为类对象,并从对象中返回对象ID字段(字符串类型)。功能。 VB6应用程序调用函数并尝试获取id值。但是它不会检索该值。 .NET应用程序中使用相同的COM Dll和相同的功能。 (C#),则可以检索id字段值。

如何在VB 6中获得正确的值?高度赞赏您的回应。

COM Dll功能代码


public string TestGETTransactionId(string transaction_id,ref string exceptionMessage)
        {
            exceptionMessage = "";
            string sReturnString = " - 9999";

            try
            {
                string sDomain = HostUrl;
                string sNamespace = Namespace;
                string sLocationId = LocationID;
                string sDeveloperId = DeveloperID;
                string sUserId = UserId;
                string sUserAPIKey = UserApiId;
                string sUserHashKey = UserHashKey;
                string sEndPoint = TransactionsRetail;

                //query to see if it is Okay...                
                sEndPoint = "transactions";
                string sUrl = sDomain + @"/" + sNamespace + @"/" + sEndPoint + "?transaction_id=" + transaction_id;              
                var client = new RestClient(sUrl);                
                client.Timeout = -1;
                var request = new RestRequest(Method.GET);
                request.AddHeader("user-id",sUserId);
                request.AddHeader("user-api-key",sUserAPIKey);
                request.AddHeader("developer-id",sDeveloperId);
                request.AddHeader("Content-Type","application/json");                
                IRestResponse response = client.Execute(request);
              

                TransactionRetail_Rootobject transactionRetail_Rootobject = SimpleJson.DeserializeObject<TransactionRetail_Rootobject>(response.Content);              

                if (transactionRetail_Rootobject.transactions != null)
                {
                    sReturnString = transactionRetail_Rootobject.transactions[0].id.ToString();
                }         

            }
            catch (Exception ex)
            {              
                exceptionMessage = ex.Message + "\n" + ex.InnerException;
            }
            return sReturnString; 

     }

VB6 Caller:

    Dim sTransaction_api_id As String    
    Dim sExceptionMesg As String
    Dim sReturnedId As String
'
    sTransaction_api_id = "SAMINC_transID001"  ' change this to try
    
    sReturnedId = MyCOMDLL.MyComDllClass(sTransaction_api_id,sExceptionMesg)
    
    MsgBox sReturnedId    'This always return the error code -9999 and I expect to get the true ID field value
    
    MsgBox sExceptionMesg

C# Caller:

        private void btnTestGetTransaction_Click(object sender,EventArgs e)
        {
            string sTransaction_id = "SAMINC_transID001";
            string sExceptionMesg = "";
           
            MyCOMDLL.MyComDllClass obj = new MyCOMDLL.MyComDllClass();

            string sResult = obj.TestGETTransactionId(sTransaction_id,ref sExceptionMesg);

            MessageBox.Show(sResult); // this returns the ID field value fine

            textBox1.Text = sResult;

        }

解决方法

您提供的VB6和C#代码似乎有所不同。

即,您正在VB6中调用其他构造函数:

sReturnedId = MyCOMDLL.MyComDllClass(sTransaction_api_id,sExceptionMesg)

与C#版本相比:

MyCOMDLL.MyComDllClass obj = new MyCOMDLL.MyComDllClass();

然后您在其上调用TestGETTransactionId方法:

string sResult = obj.TestGETTransactionId(sTransaction_id,ref sExceptionMesg);

尝试以下操作:

obj = MyCOMDLL.MyComDllClass()

sResult = obj.TestGETTransactionId(sTransaction_api_id,sExceptionMesg)

MessageBox sResult 

注意:我尚未在IDE中测试过代码。

,

谢谢大家。

发生的事情是我不得不使用不同的方式来进行网络服务调用。我在 .NET 中使用 WinHttp 引用来创建 Web 服务调用的例程,而不是使用 RestClient。 WinHttp 为与 VB 6 的通信提供了更高的透明度。来自 VB 6 和 C# 的调用者无需更改。