1

好的,我正在使用 WCF 构建客户端服务器应用程序,NetTcpBinding 由 WinForms 应用程序托管和使用。我在 Windows 7 Ultimate x64 中使用 VS.2012 Ultimate。

我可以启动托管服务的winform,我可以启动服务。现在,在客户端,我启动客户端应用程序并立即得到一个 Microsoft WCF 服务主机窗口,告诉我:

System.BadImageFormatException. Could not load file or assembly X.Services.dll ... an
attempt was made to load a program with an incorrect format.
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
at Microsoft.Tools.SvcHost.ServiceHostHelper.LoadServiceAssembly(String svcAssemblyPath)

现在,客户端和服务器 WinForm 项目都有对定义服务(接口和实现类)的 X.Services.dll 的引用。那么,为什么服务器不抱怨呢?

此外,我已确保此解决方案中的所有项目都将其调试和发布配置设置为相同的 .NET Framework (4.5) 和相同的目标平台(x86 而不是任何 CPU)。

此外,唯一的外部程序集引用(实用程序库 DLL)也是使用相同的 VS 版本构建的,用于相同的框架 (4.5) 和相同的平台 (x86)。

那么这种糟糕的图像格式是从哪里来的呢?该解决方案有自己的外部库副本(以确保它具有正确的平台和框架配置)并且项目文件已被修改,以便它采用相应的发布/调试版本的外部程序集。

根据异常的提示,我使用 regedit 在 HKLM 中添加一个键以启用程序集加载/绑定日志记录并获得以下额外信息:

=== Pre-bind state information ===
LOG: User = DOMAIN\Username
LOG: Where-ref bind. Location =    D:\Sources\My.Net\Code\T\X.Services\bin\Debug\X.Services.dll
LOG: Appbase = file:///D:\Sources\My.Net\Code\T\X.Services\bin\Debug\X.Services/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be      probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: D:\Sources\My.Net\Code\T\X.Services\bin\Debug\X.Services.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Attempting download of new URL file:///D:\Sources\My.Net\Code\T\X.Services\bin\Debug\X.Services.dll.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

这对我来说没有任何用处...

4

2 回答 2

0

问题可能在:

日志:使用 C:\Windows\Microsoft.NET\Framework 64 \v 4.0 .30319\config\machine.config 中的机器配置文件。

似乎应用程序在 .NET 4.0 x64 下启动。尝试分析您的程序集(例如,通过 .NET Framework SDK 中的 corflags.exe)以确定所需的平台和 .NET 版本。

于 2013-04-29T09:10:02.933 回答
0

我不知道这是否仍然有效,但这与此线程中的问题相同。解决方案是像这里一样在 x86 中运行每个进程。

创建第二个 WcfSvcHost 作为 x86 变体是最简单的方法,如下所示:

以管理员权限启动 cmd 环境:

C:\

cd "c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE"

c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

复制 WcfSvcHost.exe WcfSvcHost32.exe 已复制 1 个文件。

c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

corflags /32BIT+ /Force WcfSvcHost32.exe Microsoft (R) .NET Framework CorFlags 转换工具。版本 4.0.30319.1 版权所有 (c) Microsoft Corporation。版权所有。

corflags : 警告 CF011 : 指定的文件是强名称签名的。
使用 /Force 将使该图像的签名无效,并要求程序集被退出。

c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

然后您可以使用以下命令托管您的项目:

WcfSvcHost32.exe /service:%enteryourservicenamehere%.dll /config:%yourconfigfilehere.dll.config%

这对我有用。

于 2016-03-11T13:02:54.743 回答