无法从传输连接读取数据 VB6 调用 Com 可见的 C# 库

3
我有一个使用c# Framework 4.7.2构建的Com可见库,该库调用一个Web API。
在VS2017 C# IDE库中运行单元测试正常。
但是,如果我尝试通过VB6进行调用,则会出现以下错误:
System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭了一个现有的连接。
System.Net.Sockets.SocketException
我正在运行Windows 10并以管理员身份运行。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm /codebase /verbose  /tlb:SBD.ComBridge.tlb C:\dev\SBD.ComBridge.dll 

创建.dll和.tlb文件

我还尝试以管理员身份从VS2017命令提示符中运行regasm。

RegAsm报告库成功注册。

在Vb6中,(简化的)代码是:

Dim o As SBD_ComBridge.BridgeImplementation
Set o = New dBridgeImplementation
o.SetOrderDates id 
set o = nothing

在BridgeImplementation中,简化后的代码如下:
[DispId(25)]
[ComVisible(true)]
public void SetOrderDates(int Id)
{
     PackAndSend.SetReadByInfo(Id) // calls freight service
}

我知道从SetReadyByInfo中调用服务的代码是工作的,因为当我在VS2017中运行单元测试时,它通过了测试。
不幸的是,我被要求不发布代码。然而,我知道vb6代码正确调用Com,因为我调用其他方法没有错误。
我曾经遇到过类似的问题,与MYOB api和TLS有关的解决方案是升级框架。但是我不能升级VB6框架(大规模重写不是一个选项)。可能我会制作.Exe并启动它。
[更新] Simon Mourier给我的链接解决了这个问题。如果我添加
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

那么我的com调用在VB6上就可以工作了

正如链接所指出的,

这不是一个好的解决方案,因为它硬编码了要使用哪个TLS版本,所以它将来不会使用TLS 1.3


1
需要展示一些代码,包括调用的 VB6 代码和可能涉及到的 .NET 代码。 - tcarvin
如果您遇到了.NET异常,则您的VB6代码确实调用了.NET库。如果您对您的VB6代码是否正在加载和调用您的.NET库有任何疑问,请在.NET库中创建一个空操作方法并首先调用它。如果成功,则我们知道您正在正确执行基本的.NET / COM互操作。然后我们可以查看PackAndSend.SetReadByInfo。我知道您是从单元测试中调用它的,但我敢打赌您的单元测试没有从STA线程化的32位应用程序中调用以模拟VB6程序。一步一步来。 - tcarvin
2
正如您发现的那样,TLS 可能是问题所在。但是如果机器和安装的 .NET 框架支持 TLS 1.2(因为您说它与其他程序一起工作),则不必升级任何内容。 您的 VB6 exe 可能没有使用正确的 .NET Framework(在给定的机器上可能安装了多个),或者没有使用有效的配置。 例如,请查看这里的答案:https://dev59.com/QVcP5IYBdhLWcg3wL3YN#44765698(根据您的上下文进行调整) - Simon Mourier
1
根据@SimonMourier的链接,您可以使用代码显式设置ServicePointManager.SecurityProtocol。您可以尝试使用配置文件路线,但由于VB6是主机应用程序,我不确定基于配置文件的方法是否有效。 - tcarvin
1
谢谢 :-) 如果您找到解决方案,您应该自己回答并详细说明您所做的工作。 - Simon Mourier
显示剩余4条评论
1个回答

0
根据我问题底部的更新部分,解决方法是包含...
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我需要进一步调查以获得更完整的解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接