WcfSvcHost BadImageFormatException при выполнении приложения-службы WCF

Хорошо, я создаю клиент-серверное приложение, использующее WCF с NetTcpBinding, размещенное и используемое приложением WinForms. Я использую VS.2012 Ultimate в Windows 7 Ultimate x64.

Я могу запустить winform, на которой размещен сервис, и могу запустить сервис. Теперь на стороне клиента я запускаю клиентское приложение и сразу же получаю окно Microsoft WCF Service Host, сообщающее мне:

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, который определяет сервисы (интерфейс и класс реализации). Итак, почему сервер не жалуется на это?

Кроме того, я позаботился о том, чтобы ВСЕ проекты в этом решении ОБА имели свои конфигурации Debug & Release, настроенные на одну и ту же платформу.NET Framework (4.5) и ЖЕ целевую платформу (x86 вместо Any CPU).

Кроме того, единственная ссылка на внешнюю сборку (DLL-библиотека служебной библиотеки) также собрана с той же версией VS, для той же платформы (4.5) И той же платформы (x86).

Так откуда взялся этот плохой формат изображения? Решение имеет свою собственную копию внешней библиотеки (чтобы убедиться, что она имеет правильную конфигурацию платформы и платформы), а файлы проекта были изменены, чтобы принять соответствующую версию Release/Debug внешней сборки.

Следуя подсказке из исключения, я использовал 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.

что мне не говорит мне ничего полезного...

2 ответа

Я не знаю, если это все еще активно, но это тот же вопрос, что и в этой теме. Решение состоит в том, чтобы запустить каждый процесс в 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

copy wcfSvcHost.exe WcfSvcHost32.exe 1 файл (ов) скопирован.

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

corflags / 32BIT + /Force WcfSvcHost32.exe Средство преобразования CorFlags для Microsoft (R) .NET Framework. Версия 4.0.30319.1 Авторские права (c) Microsoft Corporation. Все права защищены.

corflags: warning CF011: указанный файл имеет строгое имя.
Использование /Force сделает недействительной подпись этого изображения и потребует отставки сборки.

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

Затем вы можете разместить свой проект с помощью команды:

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

вот что сработало для меня.

Может быть проблема в:

LOG: использование файла конфигурации компьютера из C: \ Windows \ Microsoft.NET \ Framework64\ v4.0.30319 \ config \ machine.config.

Похоже, что приложение запускается под.NET 4.0 x64. Попробуйте проанализировать вашу сборку (например, с помощью corflags.exe из.NET Framework SDK), чтобы определить требуемую платформу и версию.NET.

Другие вопросы по тегам