初始化外部 COM 对象导致 w3wp.exe 崩溃并出现 "Access Violation" 错误
Initializing an external COM object causes w3wp.exe to crash with "Access Violation" error
我正在尝试将标签打印设备 Brother b-Pac printing library 实施到我的 Web 应用程序中。我需要 create/load 服务器上的标签模板并通过浏览器从客户端机器打印。
我的代码完全适用于我的开发环境。它只发生在已发布的版本上。这是应用程序调用 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
的 read/write 权限和 DLL 自己的文件夹授予故障 w3wp.exe
的 IIS APPPOOL/user
。
- 向
IIS_IUSRS, NETWORK, NETWORK SERVICE
用户授予相同的权限。
- 模拟
Administrator
用户。
- Uninstall/install b-Pac SDK 的 32 位/64 位版本。
- 将我的 ASP 应用程序和其中所有项目的位数更改为 x86/x64。
- 在应用程序池上启用 32 位。
- 为 July 2018 update issue
修补 Windows
- 设置匿名身份验证、应用程序池身份等 全部设置为默认池用户。
- 正在动态加载 DLL。 (虽然不确定我这样做是否正确)
我要初始化的 COM 对象是 bpac.Document
。界面是IDocument
,具体的class是DocumentClass
。我以前对这些概念都不熟悉。我仍在努力理解,但我尝试了以下所有这些行进行初始化:
Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();
之后,我使用标签对象打开模板等。但是一旦应用程序遇到上述任何一行,它就会使服务器崩溃并重新启动应用程序。
顺便说一下,DLL 文件在我的 WebService (App) 项目(而不是 Web 项目)中被引用为 COM 库。所以它不会被复制到 bin
文件夹(我想这是正确的行为?)。尝试更改 isolation/interop 设置,但我不确定这些设置是否与手头的问题有关。
我阅读了有关将 COM 对象注册到 GAC 和 远程访问编组 的内容,但我无法掌握如何正确应用这些内容.问题是,官方文档对此没有任何说明。并且没有一个在现代 C# ASP.NET 设置 (only a little on VB ~eww~) 上使用 b-Pac 库的示例。
我是开发人员,不是 DBA,所以我对调整服务器设置不太自信。但是仅仅为了这个问题,我修改了太多太多次。
所以,问题一直是关于应用程序 ID 权限的。我将应用程序池的标识更改为 LocalSystem,现在它按预期工作。
不过,我不确定此更改将来会导致什么样的安全漏洞。我把这个 link 发给了供应商的技术人员。但是他们还没有给我答复。
我正在尝试将标签打印设备 Brother b-Pac printing library 实施到我的 Web 应用程序中。我需要 create/load 服务器上的标签模板并通过浏览器从客户端机器打印。
我的代码完全适用于我的开发环境。它只发生在已发布的版本上。这是应用程序调用 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
的 read/write 权限和 DLL 自己的文件夹授予故障w3wp.exe
的IIS APPPOOL/user
。 - 向
IIS_IUSRS, NETWORK, NETWORK SERVICE
用户授予相同的权限。 - 模拟
Administrator
用户。 - Uninstall/install b-Pac SDK 的 32 位/64 位版本。
- 将我的 ASP 应用程序和其中所有项目的位数更改为 x86/x64。
- 在应用程序池上启用 32 位。
- 为 July 2018 update issue 修补 Windows
- 设置匿名身份验证、应用程序池身份等 全部设置为默认池用户。
- 正在动态加载 DLL。 (虽然不确定我这样做是否正确)
我要初始化的 COM 对象是 bpac.Document
。界面是IDocument
,具体的class是DocumentClass
。我以前对这些概念都不熟悉。我仍在努力理解,但我尝试了以下所有这些行进行初始化:
Document label = new Document();
DocumentClass label = new DocumentClass(); //embed interop types: false
IDocument label = new Document();
之后,我使用标签对象打开模板等。但是一旦应用程序遇到上述任何一行,它就会使服务器崩溃并重新启动应用程序。
顺便说一下,DLL 文件在我的 WebService (App) 项目(而不是 Web 项目)中被引用为 COM 库。所以它不会被复制到 bin
文件夹(我想这是正确的行为?)。尝试更改 isolation/interop 设置,但我不确定这些设置是否与手头的问题有关。
我阅读了有关将 COM 对象注册到 GAC 和 远程访问编组 的内容,但我无法掌握如何正确应用这些内容.问题是,官方文档对此没有任何说明。并且没有一个在现代 C# ASP.NET 设置 (only a little on VB ~eww~) 上使用 b-Pac 库的示例。
我是开发人员,不是 DBA,所以我对调整服务器设置不太自信。但是仅仅为了这个问题,我修改了太多太多次。
所以,问题一直是关于应用程序 ID 权限的。我将应用程序池的标识更改为 LocalSystem,现在它按预期工作。
不过,我不确定此更改将来会导致什么样的安全漏洞。我把这个 link 发给了供应商的技术人员。但是他们还没有给我答复。