Приложение ASP.NET 2.0 работает в Win 2003 в режиме изоляции IIS 5, но не в (по умолчанию) режиме IIS 6

Приложение использует DLLImport для вызова устаревшей неуправляемой библиотеки DLL. Ради этого вопроса назовем эту dll Unmanaged.dll. Unmanaged.dll зависит от 5 других устаревших dll. Все унаследованные библиотеки DLL помещаются в каталог WebApp / bin / моего приложения ASP.NET.

Когда IIS работает в режиме изоляции 5.0, приложение работает нормально - вызовы устаревшей библиотеки DLL обрабатываются без ошибок.

Когда IIS работает в режиме 6.0 по умолчанию, приложение может инициировать Unmanaged.dll (InitMe ()), но умирает во время последующего обращения к нему (ProcessString ()).

Я выдергиваю свои волосы здесь. Я переместил длл неуправляемое это в различные места, перепробовал все виды настроек безопасности и искал долго и упорно для решения. Помощь!

Образец кода:

[DllImport("Unmanaged.dll", EntryPoint = "initME", CharSet=System.Runtime.InteropServices.CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
    internal static extern int InitME();
//Calls to InitMe work fine - Unmanaged.dll initiates and writes some entries in a dedicated log file
[DllImport("Unmanaged.dll", EntryPoint = "processString", CharSet=System.Runtime.InteropServices.CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
    internal static extern int ProcessString(string inStream, int inLen, StringBuilder outStream, ref int outLen, int maxLen);
//Calls to ProcessString cause the app to crash, without leaving much of a trace that I can find so far

Обновлять:

Обратно со стопкой, взятой с мини-свалки. Кажется, переполнение стека, но я хотел бы знать больше, если кто-то может мне помочь. Результаты "kb" в WinDbg с загруженным sos.dll:

1beb51fc 7c947cfb 7c82202c 00000002 1beb524c ntdll!KiFastSystemCallRet  
1beb5200 7c82202c 00000002 1beb524c 00000001 ntdll!NtWaitForMultipleObjects+0xc  
WARNING: Stack unwind information not available. Following frames may be wrong.  
1beb52a8 7c822fbe 00000002 1beb52ec 00000000 kernel32!WaitForMultipleObjectsEx+0xd2  
1beb52c4 7a2e1468 00000002 1beb52ec 00000000 kernel32!WaitForMultipleObjects+0x18  
1beb5308 7a2d00c4 7a0c3077 1bc4ffd8 1bc4ffd8 mscorwks!CreateHistoryReader+0x19e9d  
1beb531c 7a0c312f 7a0c3077 1bc4ffd8 888d9fd9 mscorwks!CreateHistoryReader+0x8af9  
1beb5350 7a106b2d 1b2733a0 00000001 1b2733a0 mscorwks!GetCompileInfo+0x345ed  
1beb5378 7a105b91 1b272ff8 1b2733a0 00000001 mscorwks!GetAddrOfContractShutoffFlag+0x93a8  
1beb53e0 7a105d46 1beb5388 1b272ff8 1beb5520 mscorwks!GetAddrOfContractShutoffFlag+0x840c  
1beb5404 79fe29c5 00000001 00000000 00000000 mscorwks!GetAddrOfContractShutoffFlag+0x85c1  
1beb5420 7c948752 1beb5504 1beef9b8 1beb5520 mscorwks!NGenCreateNGenWorker+0x4d52  
1beb5444 7c948723 1beb5504 1beef9b8 1beb5520 ntdll!ExecuteHandler2+0x26  
1beb54ec 7c94855e 1beb1000 1beb5520 1beb5504 ntdll!ExecuteHandler+0x24  
1beb54ec 1c9f2264 1beb1000 1beb5520 1beb5504 ntdll!KiUserExceptionDispatcher+0xe  
1beb57f4 1c92992d 1beb6e28 1db84d70 1db90e28 Unmanaged1!UMgetMaxSmth+0x1200ad  
1beb5860 1c929cfe 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x57776  
1beb58c0 1c930b04 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x57b47  
1beb5924 1c99d088 00000000 1db84d70 1beb6e28 Unmanaged1!UMgetMaxSmth+0x5e94d  
1beb5990 1c99c955 00000000 1beb6e28 1beb6590 Unmanaged1!UMgetMaxSmth+0xcaed1  
1beb5a44 1c99e9ae 00000000 40977000 1db90e28 Unmanaged1!UMgetMaxSmth+0xca79e  
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
554
4

Ответы 4

Что это за ошибка? если приложение действительно аварийно завершилось, вам, возможно, придется войти в журнал событий Windows, чтобы получить трассировку стека ошибки.

Я запускал procmon, debugdiag, пробовал работать с инструментами отладки Microsoft. Каждый раз при сбое приложения «Доктор Ватсон» создает пару файлов - .dmp и .tmp (которые я безуспешно пытался отладить).

Вот ошибка из журнала событий:

Тип события: Error
Источник события: отчет об ошибках .NET Runtime 2.0
Категория события: Нет Код события: 1000
Дата: 30.09.2008
Время: 16: 13: 38
Пользователь: Не применимо Компьютер: APPLICATIONTEST010
Описание:
Неисправное приложение w3wp.exe, версия 6.0.3790.3959, штамп 45d6968e, неисправный модуль Unmanaged1.dll, версия 0.0.0.0, штамп 48b6bfb8, отладка? 0, адрес ошибки 0x00122264.

Решение: Создайте новый поток, в котором будет запускаться импортированная dll, назначьте больше памяти для его стека.

Я думаю, что потенциальная проблема, которую следует искать здесь, заключается в том, что ваша DLL может быть выгружена во время выполнения между вызовами InitME и ProcessString - поэтому, если ProcessString зависит от вызова InitME первым, это может пойти "бум".

Решением этого будет использование старых добрых LoadLibrary и FreeLibrary, чтобы заставить среду выполнения поддерживать загрузку библиотеки между вызовами этих двух функций. GetProcAddress не нужен (насколько я могу судить).

Другие вопросы по теме