初始化外部COM对象会导致w3wp.exe崩溃,并显示“访问冲突”错误

时间:2019-02-05 11:06:59

标签: c# asp.net iis com w3wp

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

我的代码完全可以在我的开发环境中工作。它仅在发布的版本上发生。应用程序调用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的调试符号,所以它可能是不完整的(如果有帮助,我想知道在哪里以及如何获得第三方DLL的符号)

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

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

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

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

DocumentClass

此后,我正在使用标签对象打开模板等。但是,一旦应用程序碰到上述任何行,它将使服务器崩溃并重新启动应用程序。

偶然地,在我的WebService(App)项目(而不是Web项目)中,DLL文件被引用为COM库。因此它不会被复制到Document label = new Document(); DocumentClass label = new DocumentClass(); //embed interop types: false IDocument label = new Document(); 文件夹中(我想这是正确的行为吗?)。尝试更改隔离/互操作设置,但不确定这些是否与当前问题有关。

我阅读了有关将COM对象注册到GAC 为远程访问编组的内容,但是我不知道如何正确地应用这些对象。事实是,官方文档对此没有任何说明。在现代C#ASP.NET设置(only a little on VB〜eww〜)上,没有使用b-Pac库的示例。

我是开发人员,而不是DBA,因此我对调整服务器设置不太自信。但是仅就此问题而言,我修改了太多次。

1 个答案:

答案 0 :(得分:0)

因此,问题始终与应用程序ID权限有关。我将应用程序池的标识更改为 LocalSystem ,现在它可以按预期运行。

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