Невозможно прочитать данные из транспортного соединения VB6 при вызове библиотеки com visible c #

У меня есть видимая библиотека С # 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 не будет.


person Kirsten Greed    schedule 27.08.2019    source источник
comment
Придется показать некоторый код, как вызывающий код VB6, так и, вероятно, сторону .NET.   -  person tcarvin    schedule 27.08.2019
comment
PackAndSend.SetReadByInfo вызов блокировки? Это исключение .NET, поэтому я думаю, что следующий набор кода для публикации - это именно он.   -  person tcarvin    schedule 28.08.2019
comment
Если вы получаете исключение .NET, значит, ваш код VB6 действительно вызвал библиотеку .NET. Если есть какие-либо вопросы о том, загружается ли ваш код VB6 и вызывает ли вашу библиотеку .NET, создайте в библиотеке .NET метод no-op и сначала вызовите его. Если это удастся, то мы знаем, что вы правильно выполняете базовое взаимодействие .NET / COM. Тогда мы можем посмотреть на PackAndSend.SetReadByInfo. Я понимаю, что вы вызвали его из модульного теста, но держу пари, что ваш модульный тест не вызывается из 32-разрядного приложения с потоком STA для имитации программы VB6. Тем не менее, шаг за шагом.   -  person tcarvin    schedule 28.08.2019
comment
Если вы знаете, что VB6 правильно вызывает C # SetOrderDates, и этот код вызывает только PackAndSend.SetReadByInfo(Id), то следующим логическим шагом будет перечисление исходного кода этого метода. Цель состоит в том, чтобы просмотреть весь вызываемый исходный код, чтобы увидеть, какие проблемы могут возникнуть при вызове из процесса VB6. Кроме того, опубликуйте полную трассировку стека вашего исключения, это было бы чрезвычайно информативно.   -  person tcarvin    schedule 29.08.2019
comment
Спасибо @tcarvin. Я обновил вопрос, чтобы объяснить, что не могу этого сделать, и удалил некоторые из своих комментариев в чате.   -  person Kirsten Greed    schedule 30.08.2019
comment
Как вы выяснили, вероятно, проблема в TLS. Но вам не нужно ничего обновлять, если машина и установленная платформа .NET поддерживают TLS 1.2 (что, похоже, так, поскольку вы говорите, что он работает с другими программами). Возможно, ваш VB6 exe не использует хорошую .NET Framework ( их может быть несколько, установленных на данном компьютере), или не использовать работающую конфигурацию. Посмотрите ответы здесь, например: stackoverflow.com/a/44765698/403671 (адаптируйте к вашему контексту)   -  person Simon Mourier    schedule 30.08.2019
comment
На основе ссылок @SimonMourier вы, вероятно, могли бы просто использовать код для явной установки ServicePointManager.SecurityProtocol по желанию. Вы можете попробовать маршрут файла конфигурации, но поскольку VB6 является хост-приложением, я не уверен, что подход на основе файла конфигурации будет работать.   -  person tcarvin    schedule 30.08.2019
comment
@SimonMourier большое спасибо!   -  person Kirsten Greed    schedule 31.08.2019
comment
Спасибо :-) Если вы нашли решение, вам следует ответить себе, что вы сделали, чтобы оно сработало.   -  person Simon Mourier    schedule 31.08.2019


Ответы (1)


В соответствии с разделом обновления в нижней части моего вопроса, решение заключается в том, чтобы включить

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Мне нужно продолжить исследование для более полного решения

person Kirsten Greed    schedule 31.08.2019