gpt4 book ai didi

c++ - WcfSvcHost 和 IIS WCF 主机遇到 BadImageFormatException

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:15 24 4
gpt4 key购买 nike

在 Vista x64 上的 Visual Studio 2008 中创建 WCF 服务库在引用 x86 DLL 时很麻烦。调用 32 位 DLL 的服务需要具有 x86 平台目标才能在 64 位操作系统上运行。执行此操作时,WcfSvcHost 在您尝试调试服务时会抛出 BadImageFormatException。有一个 bug report在 MS 连接上。我使用的解决方法是 coreflag WcfSvcHost as 32-bit .

明显问题

我遇到的主要问题是这个第三方 native 32 位 DLL 无法使用某些 WCF 主机加载。当调用使用第三方 DLL 的服务操作时,我收到以下错误:

System.TypeInitializationException: The type initializer for '' threw an exception.

.ModuleLoadExceptionHandlerException: A nested exception occurred after the primary exception that caused the C++ module to fail to load.

System.BadImageFormatException: The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)

嵌套异常:

The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))

此异常不会在 WcfSvcHost 启动时引发,而是在调用引用 32 位 DLL 的服务操作时引发。非常有趣的是,在控制台应用程序上使用相同的 app.config 托管相同的服务没有异常(exception)并且完美运行:

using (ServiceHost host = new ServiceHost (typeof (MsgBrokerService))) {
host.Open ();
Console.WriteLine ("running");
Console.ReadLine ();

此异常发生在:

'WcfSvcHost.exe' (Managed): Loaded 'C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36\msvcm80.dll'

同样,控制台应用程序没有异常并加载相同的 DLL:

'ConsoleApp.vshost.exe' (Managed): Loaded 'C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36\msvcm80.dll'

查看答案 from Microsoft Product Support .

更新 #1:控制台应用程序和 WcfSvcHost.exe 主机进程都在同一 session 和登录用户 (me) 下运行。我已将 WcfSvcHost.exe 复制到服务目录,手动启动并遇到相同的结果。我还检查了 Windows 事件日志以获取更多信息并使用了 sxstrace,但未记录任何内容。

运行 Process Explorer,我已经验证了两个进程之间的以下内容相同:

  • 图像:32 位
  • 当前目录
  • 用户/SID
  • session
  • 安全(组被拒绝,权限被禁用)

运行进程监视器,和 configuring symbols ,我看到 WcfSvcHost 寻找以下注册表和文件,而控制台主机没有。 Process Monitor 记录了大量数据,我不确定自己在寻找什么 :(

HKLM\SOFTWARE\Microsoft\Fusion\PublisherPolicy\Default\policy.8.0.msvcm80__b03f5f7f11d50a3a C:\Windows\assembly\GAC_32\msvcm80\8.0.50727.3053__b03f5f7f11d50a3a C:\Windows\assembly\GAC_MSIL\msvcm80\8.0.50727.3053__b03f5f7f11d50a3a C:\Windows\assembly\GAC\msvcm80\8.0.50727.3053__b03f5f7f11d50a3a

更新 #2:当服务在 IIS 6/Windows Server 2003 上在生产中托管时,也会发生同样的异常。

更新 #3:第 3 方 32 位 .NET 程序集是 StreamBase API :

  • sbclient.dll(托管)
  • monitor.netmodule(托管)
  • dotnetapi.dll(非托管)
  • pthreads-vc8.dll(非托管)

更新 #4:添加 list 但没有成功:

  1. 已验证 dotnetapi.dll 和 pthreads-vc8.dll 具有 RT_MANIFEST。 sbclient.dll .NET 程序集没有 list
  2. 从 GAC 中删除了 sbclient.dll
  3. 注册sbclient.dll 用于跳过验证
  4. 通过 mt.exe 添加 list 到 sbclient.dll 和 monitor.netmodule
  5. 添加了经过验证的 list ,并且在测试期间加载了预期的文件(通过 Visual Studio - 调试模块窗口)
  6. 在 BackgroundWorker.OnDoWork() 下抛出相同的 BadImageFormatException,调用堆栈显示对 dotnetapi.dll...DefaultDomain.Initalize() 的调用。

我已验证 msvcm80.dll 没有 list ,我相信这是唯一没有 list 的加载文件:)

有趣的发现

当我在 Reflector 中加载 monitor.netmodule 时,它说:

'monitor.netmodule' does not contain an assembly manifest.

即使显示错误,Reflector 仍然能够反汇编托管代码。

最佳答案

有点晚了,但您也可以在高级设置中将应用程序池设置“启用 32 位应用程序”更改为 true。

关于c++ - WcfSvcHost 和 IIS WCF 主机遇到 BadImageFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com