如何从 VB6.0 中的 .NET COM 可见 dll 获取 Json 字段值的值
How to get value of Json field value from a .NET COM visible dll in VB6.0
我有一个用于 Web 服务的 C# COM 可见 DLL。 VB6 应用程序正在引用和使用该 COM 可见 DLL。 COM可见DLL有一个函数,从一个web服务调用中拉取数据,并以Json格式获取数据,然后它还将Json文档反序列化为一个class对象, returns 函数中的对象 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# 的调用者不需要更改。
我有一个用于 Web 服务的 C# COM 可见 DLL。 VB6 应用程序正在引用和使用该 COM 可见 DLL。 COM可见DLL有一个函数,从一个web服务调用中拉取数据,并以Json格式获取数据,然后它还将Json文档反序列化为一个class对象, returns 函数中的对象 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# 的调用者不需要更改。