Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从VB6.0中的.NET COM可见dll获取Json字段值_C#_Json_Types_Vb6_Legacy - Fatal编程技术网

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

C# 如何从VB6.0中的.NET COM可见dll获取Json字段值,c#,json,types,vb6,legacy,C#,Json,Types,Vb6,Legacy,我有一个C#COM可视DLL,可以与web服务一起工作。该COM可见DLL正在VB6应用程序中引用和使用。COM visible DLL有一个函数,该函数从web服务调用中提取数据并以Json格式获取数据,然后还将Json文档反序列化为类对象,并从该函数返回对象id字段(字符串类型)。VB6应用程序调用该函数并尝试获取id值。但它不检索该值。在.NET应用程序中使用相同的COM Dll和相同的函数。(C#),则可以检索id字段值 如何在VB6中获得正确的值?非常感谢您的回复 COM Dll函数代

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

如何在VB6中获得正确的值?非常感谢您的回复

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;

        }


公共字符串TestGETTransactionId(字符串事务\u id,引用字符串例外消息)
{
例外消息=”;
字符串sReturnString=“-9999”;
尝试
{
字符串sDomain=HostUrl;
字符串sNamespace=名称空间;
字符串sLocationId=位置ID;
字符串sDeveloperId=DeveloperID;
字符串sUserId=UserId;
字符串sUserAPIKey=userapid;
字符串sUserHashKey=UserHashKey;
字符串sEndPoint=TransactionsRetail;
//查询以查看它是否正常。。。
sEndPoint=“交易”;
字符串sUrl=sDomain+@“/”+sNamespace+@“/”+sEndPoint+“?事务id=“+transaction\u id”;
var客户端=新的RestClient(sUrl);
client.Timeout=-1;
var请求=新的重新请求(Method.GET);
AddHeader(“用户id”,sUserId);
AddHeader(“用户api密钥”,sUserAPIKey);
AddHeader(“开发者id”,sDeveloperId);
AddHeader(“内容类型”、“应用程序/json”);
IRestResponse response=client.Execute(请求);
TransactionRetail\u Rootobject TransactionRetail\u Rootobject=SimpleJson.DeserializeObject(response.Content);
if(transactionRetail_Rootobject.transactions!=null)
{
sReturnString=transactionRetail_Rootobject.transactions[0]。id.ToString();
}         
}
捕获(例外情况除外)
{              
exceptionMessage=ex.Message+“\n”+ex.InnerException;
}
返回返回字符串;
}
VB6调用者:
Dim sTransaction\u api\u id作为字符串
Dim sExceptionMesg作为字符串
Dim SRETREEDID为字符串
'
sTransaction\u api\u id=“SAMINC\u transID001”将此更改为“尝试”
sReturnedId=MyCOMDLL.MyComDllClass(sTransaction\u api\u id,sExceptionMesg)
MsgBox sReturnedId'这总是返回错误代码-9999,我希望得到真实的ID字段值
MsgBox sExceptionMesg
主叫人:
私有void btnTestGetTransaction\u单击(对象发送者,事件参数e)
{
字符串转换\u id=“SAMINC\u transID001”;
字符串sExceptionMesg=“”;
MyCOMDLL.MyComDllClass obj=新的MyCOMDLL.MyComDllClass();
string sResult=obj.TestGETTransactionId(sTransaction_id,ref sExceptionMesg);
Show(sResult);//返回ID字段值
textBox1.Text=sResult;
}

您提供的VB6和C代码似乎有些不同

即,在VB6中调用不同的构造函数:

sReturnedId = MyCOMDLL.MyComDllClass(sTransaction_api_id, sExceptionMesg)
与C版本相比:

然后调用
TestGETTransactionId
方法:

string sResult = obj.TestGETTransactionId(sTransaction_id, ref sExceptionMesg);
请尝试以下操作:

obj = MyCOMDLL.MyComDllClass()

sResult = obj.TestGETTransactionId(sTransaction_api_id, sExceptionMesg)

MessageBox sResult 

注意:我没有在IDE中测试代码。

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

即,在VB6中调用不同的构造函数:

sReturnedId = MyCOMDLL.MyComDllClass(sTransaction_api_id, sExceptionMesg)
与C版本相比:

然后调用
TestGETTransactionId
方法:

string sResult = obj.TestGETTransactionId(sTransaction_id, ref sExceptionMesg);
请尝试以下操作:

obj = MyCOMDLL.MyComDllClass()

sResult = obj.TestGETTransactionId(sTransaction_api_id, sExceptionMesg)

MessageBox sResult 
注意:我还没有在IDE中测试代码。

谢谢大家

发生的事情是,我不得不使用另一种方式进行web服务调用。我使用.NET中的WinHttp引用为web服务调用创建例程,而不是使用RestClient。WinHttp为与VB6通信提供了更高的透明度。VB 6和C的调用方不需要更改。

谢谢大家


发生的事情是,我不得不使用另一种方式进行web服务调用。我使用.NET中的WinHttp引用为web服务调用创建例程,而不是使用RestClient。WinHttp为与VB6通信提供了更高的透明度。VB 6和C的调用者不需要更改。

是ref string exception消息吗?如果返回错误本身呢?So:返回ex.Message.ToString();(例外情况)?那会给你更多的信息。查看代码,我怀疑.net有错误。它可能更高,所以裁判不会被填满,你也看不到它。我有使用VB6 20年的经验和.net超过10年的经验。还有COM和SOAP以及.NET和VB6。请告诉我您需要什么。NET调用方没有任何错误。我可以在.NET调用者中获取ID值。问题出在TransactionRetail\u Rootobject TransactionRetail\u Rootobject=SimpleJson.DeserializeObject(response.Content)行中;VB6调用者无法执行此行并出错。“SimpleJson”是RestSharp的一个静态类。只需调用Json反序列化程序将Json文档解析为类对象,这样我就可以检索字段ID值。它是ref string exceptionMessage吗?如果返回错误本身呢?So:返回ex.Message.ToString();(例外情况)?那会给你更多的信息。看看代码,我怀疑t