我有一个使用c# Framework 4.7.2构建的Com可见库,该库调用一个Web API。
在VS2017 C# IDE库中运行单元测试正常。
但是,如果我尝试通过VB6进行调用,则会出现以下错误:
System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭了一个现有的连接。
System.Net.Sockets.SocketException
我正在运行Windows 10并以管理员身份运行。
在BridgeImplementation中,简化后的代码如下:
我知道从SetReadyByInfo中调用服务的代码是工作的,因为当我在VS2017中运行单元测试时,它通过了测试。
不幸的是,我被要求不发布代码。然而,我知道vb6代码正确调用Com,因为我调用其他方法没有错误。
我曾经遇到过类似的问题,与MYOB api和TLS有关的解决方案是升级框架。但是我不能升级VB6框架(大规模重写不是一个选项)。可能我会制作.Exe并启动它。
[更新] Simon Mourier给我的链接解决了这个问题。如果我添加
在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
PackAndSend.SetReadByInfo
。我知道您是从单元测试中调用它的,但我敢打赌您的单元测试没有从STA线程化的32位应用程序中调用以模拟VB6程序。一步一步来。 - tcarvinServicePointManager.SecurityProtocol
。您可以尝试使用配置文件路线,但由于VB6是主机应用程序,我不确定基于配置文件的方法是否有效。 - tcarvin