У меня есть сторонняя библиотека, которая обертывает C ++ DLL — давайте назовем это LegacyAPI
, Эта библиотека-оболочка является статическим классом с импортированными методами и не является поточно-ориентированной.
У меня есть собственная библиотека-оболочка, которая обернута вокруг этой сторонней оболочки (для ведения журналов и т. Д.). Давайте назовем это LegacyAPIWrapper
Итак, все это предполагается использовать в веб-API — давайте назовем это WebAPI
мой WebAPI
действие контроллера вызывает мой LegacyAPIWrapper
, Он проходит через некоторые методы (в том числе вызовы небезопасных LegacyAPI
) и завершается с исключением StackOverflow — всегда с одним и тем же методом из LegacyAPI
,
Чтобы устранить это, я создал консольное приложение — ConsoleApp
, Это называет мой LegacyAPIWrapper
так же, как WebAPI
делает — и это работает хорошо!
Я ввел в действие STA-поток в моих методах контроллера веб-API, как описано здесь.
http://ryanhaugh.com/archive/2014/05/24/supporting-sta-threads-in-web-api/
Кроме того, методы-оболочки также имеют атрибут STAThread.
Я ввел некоторую дополнительную логику регистрации
this.Logger.Debug($"Apartment state: [{Thread.CurrentThread.GetApartmentState()}]. Thread ID: [{Thread.CurrentThread.ManagedThreadId}]. Thread State: [{Thread.CurrentThread.ThreadState}]");
это показывает, что прямо с того места, где LegacyAPIWrapper инициализируется, туда, где он выдает ошибку, мы постоянно в одном и том же потоке, что это STA и что это запущенный поток.
Кроме того, я также попытался вызвать LegacyAPIWrapper в отдельном домене приложений, как предлагается здесь
https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp
Но это ничего не изменило. И, говоря «что-нибудь», я также имею в виду, что мы все еще находимся в одной и той же цепочке (до того, как Изолированный вызван и внутри Изолированного) — так что, возможно, я делаю что-то не так?
Любая подсказка будет оценена.
Я «решил» это — оказалось, что это вопрос размера стека стороннего приложения.
При размещении в процессе w3wp доступный стек был слишком мал — именно поэтому он работал, когда размещался как консольное приложение.
Размер стека w3wp.exe составляет 256 КБ (до 2003 года он составлял 1 МБ)
https://blogs.msdn.microsoft.com/tom/2008/03/31/stack-sizes-in-iis-affects-asp-net/
Разрешение
Других решений пока нет …