【问题标题】:Initializing an external COM object causes w3wp.exe to crash with "Access Violation" error初始化外部 COM 对象会导致 w3wp.exe 因“访问冲突”错误而崩溃
【发布时间】:2019-02-05 11:06:58
【问题描述】:

我正在尝试在我的 Web 应用程序中实现标签打印设备的 Brother b-Pac printing library。我需要在服务器上创建/加载标签模板并通过浏览器从客户端机器上打印。

我的代码完全在我的开发环境中运行。它只发生在已发布的版本上。这是应用程序调用 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

我还在转储文件和here's the report 上使用了DebugDiag。虽然这里说调试器找不到bpac.dll 的调试符号,所以它可能不完整(如果有帮助,我想知道在哪里以及如何获取第 3 方 DLL 的符号)

应用程序是一个面向 .NET Framework 4.6.1 的多层 ASP.NET MVC 应用程序,在具有 Windows Server 2012 R2 (x64) 的虚拟机上运行)IIS 8。 (如果重要,该项目源自this template

我搜索了这个问题并尝试了以下解决方案:

  • wwwroot和DLL自己的文件夹的读/写权限授予故障w3wp.exeIIS APPPOOL/user
  • IIS_IUSRS, NETWORK, NETWORK SERVICE 用户授予相同的权限。
  • 冒充Administrator用户。
  • 卸载/安装 32 位/64 位版本的 b-Pac SDK。
  • 将我的 ASP 应用程序和其中的所有项目的位数更改为 x86/x64。
  • 在应用程序池上启用 32 位。
  • July 2018 update issue 打补丁
  • 匿名身份验证、应用程序池身份等全部设置为默认池用户。
  • 动态加载 DLL。 (不确定我是否正确地这样做了)

我要初始化的 COM 对象是 bpac.Document。接口是IDocument,具体类是DocumentClass。我以前对这些概念都不熟悉。而且我仍然难以理解,但我尝试了以下所有这些行进行初始化:

Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();

之后,我使用标签对象打开模板等。但一旦应用程序遇到上述任何行,它就会使服务器崩溃并重新启动应用程序。

顺便说一句,DLL 文件在我的 WebService (App) 项目中被引用为 COM 库(而不是在 Web 项目中)。所以它不会被复制到bin 文件夹中(我猜这是正确的行为?)。尝试更改隔离/互操作设置,但我不确定这些是否与手头的问题有关。

我阅读了有关将 COM 对象注册到 GACMarshalling for Remote Access 的内容,但我无法掌握如何正确应用这些内容。问题是,官方文档对此没有任何说明。而且没有一个在现代 C# ASP.NET 设置中使用 b-Pac 库的示例 (only a little on VB ~eww~)。

我是一名开发人员,而不是一名 DBA,所以我对调整服务器的设置不太自信。但是就这个问题,我修改了太多太多的东西太多次了。

【问题讨论】:

  • “故障模块路径:C:\Program Files (x86)\Common Files\Brother\b-PAC\bpac.dll”是一个危险信号。联系供应商,看看他们是否支持在 IIS 中使用这个库(很可能不支持)。

标签: c# asp.net iis com w3wp


【解决方案1】:

所以,问题一直与应用 ID 权限有关。我将应用程序池的标识更改为 LocalSystem,现在它可以正常工作了。

不过,我不确定此更改将来会导致什么样的安全漏洞。我将此链接发布给供应商的技术人员。但他们还没有给我答复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多