У меня есть видимая библиотека С # Framework 4.7.2 Com, которая вызывает веб-API.
Модульные тесты в библиотеке VS2017 C # IDE работают нормально.
Однако, если я попытаюсь позвонить через VB6, я получу
System.IO.IOException не удалось прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто хостом rempte.
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
Я также пробовал запустить regasm из командной строки VS2017 от имени администратора.
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, потому что есть и другие методы, которые я вызываю без ошибок.
У меня была аналогичная проблема с API MYOB и TLS решение заключалось в обновлении Framework. Однако я не могу обновить фреймворк VB6 (большая перезапись не вариант). Вероятно, я просто сделаю .Exe и обработаю его.
[Обновлять]
Ссылка на Саймона Мурье дал мне решает. Если я добавлю
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
тогда мой вызов работает на VB6
Как указывает ссылка,
Это не лучшее решение, поскольку оно жестко кодирует, какую версию TLS использовать, поэтому в будущем TLS 1.3 не будет.
PackAndSend.SetReadByInfo
вызов блокировки? Это исключение .NET, поэтому я думаю, что следующий набор кода для публикации - это именно он. - person tcarvin   schedule 28.08.2019PackAndSend.SetReadByInfo
. Я понимаю, что вы вызвали его из модульного теста, но держу пари, что ваш модульный тест не вызывается из 32-разрядного приложения с потоком STA для имитации программы VB6. Тем не менее, шаг за шагом. - person tcarvin   schedule 28.08.2019SetOrderDates
, и этот код вызывает толькоPackAndSend.SetReadByInfo(Id)
, то следующим логическим шагом будет перечисление исходного кода этого метода. Цель состоит в том, чтобы просмотреть весь вызываемый исходный код, чтобы увидеть, какие проблемы могут возникнуть при вызове из процесса VB6. Кроме того, опубликуйте полную трассировку стека вашего исключения, это было бы чрезвычайно информативно. - person tcarvin   schedule 29.08.2019