Мы должны использовать API от стороннего поставщика (perforce). До сегодняшнего дня мы могли ссылаться на этот API и использовать его в приложении .net framework. Но сейчас мы занимаемся рефакторингом нашего продукта и, конечно же, решили использовать новую среду .net, а именно .net core 2.2. Поскольку Perforce не опубликовал эту библиотеку для ядра .net, мы решили перенести эту библиотеку на стандарт .net.
Итак, в двух словах мы скачали исходный код, портировали и добавили в качестве эталона в основной проект .net.
Все идет нормально. Странно то, что после некоторого использования этой библиотеки мы получаем ExecutionEngineException
из этой библиотеки, которая запускает Environment.Failfast
и завершает работу приложения.
Еще одна важная информация заключается в том, что библиотека использует другую родную библиотеку (p4bridge.dll).
Исключение такое:
FailFast:
A callback was made on a garbage collected delegate of type 'p4netapi!Perforce.P4.P4CallBacks+LogMessageDelegate::Invoke'.
at Perforce.P4.P4Bridge.RunCommandW(IntPtr, System.String, UInt32, Boolean, IntPtr[], Int32)
at Perforce.P4.P4Bridge.RunCommandW(IntPtr, System.String, UInt32, Boolean, IntPtr[], Int32)
at Perforce.P4.P4Server.RunCommand(System.String, UInt32, Boolean, System.String[], Int32)
at Perforce.P4.P4Command.RunInt(Perforce.P4.StringList)
at Perforce.P4.P4CommandResult..ctor(Perforce.P4.P4Command, Perforce.P4.StringList)
at Perforce.P4.P4Command.Run(Perforce.P4.StringList)
at Perforce.P4.Client.runFileListCmd(System.String, Perforce.P4.Options, System.String, Perforce.P4.FileSpec[])
at Perforce.P4.Client.SyncFiles(System.Collections.Generic.IList`1<Perforce.P4.FileSpec>, Perforce.P4.Options)
Я уже знаю о сообщении, связанном с garbage collected delegate
. Кажется, где-то указатель на делегата передается в неуправляемую библиотеку, а потом его собирает сборщик мусора.
Мы смотрим на исходный код этого API. И мы увидели несколько возможных мест, которые могут быть причиной этой ошибки. Но, это всего лишь мысль.
При расследовании сбоя мы создали еще одно приложение .net framework, которое ссылается на эту перенесенную библиотеку, и тогда мы не обнаружили ошибок в .net framework.
Мои вопросы:
- Есть ли разница между .net framework и .net core с точки зрения механизма сборки мусора?
- Как это возможно, что .net framework и .net core по-разному реагируют на одну и ту же библиотеку?
fixed
блока; для большинства долгоживущих сценариев вам нужно иметь дело с ручными пинами черезGCHandle
и т. д.; такой код P/Invoke очень может оказаться неправильным. Итак: если это неправильно, мы снова находимся на неопределенной территории, где неправильный код может работать при небольших значениях работы; Меня не удивит, что такой код будет хрупким из-за переключателей фреймворка. - person Marc Gravell   schedule 12.12.2019