Инициализация внешнего COM-объекта приводит к сбою w3wp.exe с ошибкой «Access Violation» - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь внедрить в мое веб-приложение библиотеку печати 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 for RemoteДоступ , но я не мог понять, как правильно их применять.Дело в том, что официальная документация ничего не говорит об этом.И нет ни одного примера использования библиотеки b-Pac в современных настройках C # ASP.NET ( немного на VB ~ eww ~).

Я разработчик, а не администратор баз данных, поэтому я не слишком уверен в настройке сервера.Но только для этой проблемы я слишком много раз модифицировал слишком много вещей.

1 Ответ

0 голосов
/ 12 февраля 2019

Итак, проблема была в разрешениях идентификатора приложения.Я изменил идентификатор пула приложений на LocalSystem , и теперь он работает, как и ожидалось.

Тем не менее, я не уверен, какие недостатки безопасности могут вызвать это изменение в будущем.Я разместил эту ссылку для технического персонала продавца.Но они еще не дали мне ответ.

...