Проблемы с COM Interop и .NET 3.5 - различное поведение в режиме отладки и выпуска - PullRequest
3 голосов
/ 21 декабря 2010

Мы устраняли неполадки в следующем и ищем новые идеи или ракурсы атаки.

Первый сценарий:

У нас есть веб-приложение ASP.NET - .NET 3.5, C #, построенный для x86 - работает на IIS7 / Windows Server 2008 R2 (64 бит).Веб-приложение ASP.NET работает в пуле приложений по умолчанию с включенными 32-разрядными приложениями.

В этом веб-приложении используются некоторые устаревшие компоненты, написанные на VB6 и созданные как библиотеки ActiveX DLL.Библиотеки регистрируются с помощью regsvr32.Ссылки на эти компоненты добавляются в проект веб-приложения (Visual Studio 2008), и мы используем сгенерированные классы Interop.

Когда веб-приложение построено в режиме выпуска, ошибки генерируются устаревшим кодом изрядноглубоко в стеке подпрограмм каждый раз, когда делается вызов этим устаревшим компонентам VB6.Обычно это что-то вроде:

ОШИБКА 91 Переменная объекта или С переменной блока не задано [ComponentName: ClassName.cls: MethodName]

Когда тот же код веб-приложения создается в режиме отладки,происходят те же ошибки, но они периодически.Если одно и то же действие повторяется в веб-приложении 10 раз (одни и те же входные данные при прочих равных условиях), мы увидим проблему примерно один раз.

Второй сценарий:

В дополнение к Интернетуприложение, у нас есть приложение .NET 3.5 C #, созданное для x86, которое работает как служба Windows на Windows Server 2008 R2 (64-разрядная версия).Эта служба выполняет вызовы ActiveX EXE, которые связаны с библиотеками DLL, используемыми на веб-сайте (общее наследие и зависимости).ActiveX EXE регистрируется с помощью ключа / regserver и ссылки, добавленной в проект .NET.Сгенерированные классы Interop используются.Как и в ActiveX EXE-файлах, вызовы методов выполняются асинхронно в своем собственном потоке и используют события для уведомления вызывающей стороны о завершении.

Если приложение .NET построено в режиме Release, вызовы методов в EXE не выполняются.выдает ошибки (насколько я могу видеть), но приложение .NET не получает событие, которое должно быть вызвано в EXE-файле ActiveX.

Если встроен тот же код приложения .NETВ режиме отладки, событие вызывается EXE-файлом и принимается / обрабатывается приложением .NET.

Я опубликовал эти проблемы вместе, потому что они оба меняются в зависимости от сборки выпуска и отладки, и я догадываюсь, что причинысвязанные с.В настоящее время мы фокусируемся на потенциальных проблемах со сборкой мусора и внепроцессной работой, выполняемой с помощью ActiveX EXE, и на проблемах с многопоточностью в веб-приложении.Любые идеи относительно областей, которые мы должны исследовать, будут приветствоваться.

1 Ответ

0 голосов
/ 20 марта 2011
...