Инициализация внешнего COM-объекта приводит к сбою w3wp.exe с ошибкой "Access Violation"
Я пытаюсь внедрить библиотеку печати Brother b-Pac для устройств печати этикеток в мое веб-приложение. Мне нужно создать / загрузить шаблон метки на сервере и распечатать с компьютера клиента через браузер.
Мой код полностью работает в моей среде разработки. Это происходит только в опубликованной версии. Это ошибка отказа в доступе, которая выдается, когда приложение вызывает объект COM. Я подозреваю, что есть внутреннее исключение, которого я не смог достичь.
Событие было зарегистрировано следующим образом:
Faulting application name: w3wp.exe, version: 8.5.9600.16384
Faulting module name: bpac.dll, version: 3.2.0.20
Exception code: 0xc0000005
Fault offset: 0x0010beea
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Program Files (x86)\Common Files\Brother\b-PAC\bpac.dll
Я также использовал DebugDiag в файле дампа и вот отчет. Хотя здесь говорится, что отладчик не может найти символы отладки для bpac.dll
, поэтому он может быть неполным (если это поможет, я хотел бы знать, где и как получить символы для сторонних DLL)
Приложение представляет собой многослойное приложение ASP.NET MVC, предназначенное для .NET Framework 4.6.1, работающее на виртуальной машине с Windows Server 2012 R2 (x64) и IIS 8. (Если это имеет значение, проект получен из этого шаблона)
Я искал проблему и пробовал следующие решения:
- Дайте разрешения на чтение / запись для
wwwroot
и собственная папка DLL вIIS APPPOOL/user
неисправностиw3wp.exe
, - Дать такие же разрешения
IIS_IUSRS, NETWORK, NETWORK SERVICE
пользователи. - олицетворять
Administrator
пользователь. - Удалите / установите 32-битные /64-битные версии b-Pac SDK.
- Измените разрядность моего ASP-приложения и всех проектов на x86/x64.
- Включить 32 бита в пуле приложений.
- Патч Windows для выпуска обновления за июль 2018
- Настройка анонимной аутентификации, удостоверения пула приложений и т. Д. Для пользователя пула по умолчанию.
- Загрузка DLL динамически. (не уверен, если я сделал это правильно, хотя)
COM-объект, который я пытаюсь инициализировать bpac.Document
, Интерфейс IDocument
и конкретный класс DocumentClass
, Я не был знаком ни с одной из этих концепций раньше. И я все еще пытаюсь понять, но я попробовал все эти следующие строки для инициализации:
Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();
После этого я использую объект метки для открытия шаблона и т. Д. Но как только приложение попадает в любую из вышеперечисленных строк, происходит сбой сервера и перезапуск приложения.
Кстати, файл DLL упоминается как библиотека COM в моем проекте WebService (App) (не в веб-проекте). Так что это не копируется на bin
папка (я думаю, это правильное поведение?). Пробовал изменить настройки изоляции / взаимодействия, но я не уверен, связаны ли они с проблемой.
Я читал кое-что о регистрации COM-объектов в GAC и Marshalling для удаленного доступа, но я не мог понять, как правильно их применять. Дело в том, что официальная документация ничего не говорит об этом. И нет ни одного примера использования библиотеки b-Pac в современных настройках C# ASP.NET ( только немного в VB ~ eww ~).
Я разработчик, а не администратор баз данных, поэтому я не слишком уверен в настройке сервера. Но только для этой проблемы я слишком много раз модифицировал слишком много вещей.
1 ответ
Итак, проблема была в разрешениях идентификатора приложения. Я изменил идентификатор пула приложений на LocalSystem, и теперь он работает, как и ожидалось.
Тем не менее, я не уверен, какие недостатки безопасности могут вызвать эти изменения в будущем. Я разместил эту ссылку для технического персонала продавца. Но они еще не дали мне ответ.