При необходимости перейдите к решению> Задать стартовые проекты> Несколько стартовых проектов> Выберите проект Wcf и проект клиента.

ние библиотеки служб WCF в Visual Studio 2008 в Vista x64 проблематично при обращении к библиотеке x86. Служба, которая вызывает 32-разрядную библиотеку DLL, должна иметь целевую платформу x86 для работы в 64-разрядной ОС. Когда вы делаете это, WcfSvcHost выдает исключение BadImageFormatException при попытке отладки службы. Существуетсообщение об ошибке на мс подключи. Обходной путь, который я использовал, былcoreflag WcfSvcHost как 32-битный.

Проблема с манифестом

Основная проблема, с которой я столкнулся, заключается в том, что эту стороннюю 32-битную DLL не удается загрузить с использованием определенных хостов WCF. Я получаю следующую ошибку, когдасервисная операция вызывается который использует стороннюю DLL:

System.TypeInitializationException: инициализатор типа для '' вызвал исключение.

.ModuleLoadExceptionHandlerException: вложенное исключение произошло после основного исключения, которое вызвало сбой загрузки модуля C ++.

System.BadImageFormatException: модуль должен содержать манифест сборки. (Исключение из HRESULT: 0x80131018)

NestedException:

Дескриптор недействителен. (Исключение из HRESULT: 0x80070006 (E_HANDLE))

Это исключение не вызывается при запуске WcfSvcHost, оно вызывается при запуске операции службы, которая ссылается на 32-разрядную DLL. Что очень интересно, хостинг этого же сервиса с тем же app.config в консольном приложении не имеет исключений и работает отлично:

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

Это исключение возникает сразу после:

«WcfSvcHost.exe» (управляемый): загружен «C: \ Windows \ WinSxS \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36 \ msvcm80.dll»

Опять же, консольное приложение не имеет исключения и загружает ту же DLL:

'ConsoleApp.vshost.exe' (управляемый): загружен 'C: \ Windows \ WinSxS \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_ none_d08d7bba442a9b36 \ msvcm80.dll'

Смотрите ответ от службы поддержки продуктов Microsoft.

Обновление № 1: и консольное приложение, и хост-процесс WcfSvcHost.exe выполняются в одном сеансе и вошли в систему (я). Я скопировал WcfSvcHost.exe в каталог службы, запустил вручную и получил тот же результат. Я также проверил журнал событий Windows для дополнительной информации и использовалsxstrace, но ничего не было зарегистрировано.

Запустив Process Explorer, я убедился, что следующие два процесса одинаковы:

Изображение: 32-разрядноеТекущий каталогПользователь / SIDсессияБезопасность (группы запрещены, привилегии отключены)

Запуск Process Monitor инастройка символовЯ вижу, что WcfSvcHost ищет следующий реестр и файлы, а консольный хост - нет.Process Monitor регистрирует много данных, и я не уверен, что я ищу :(.

HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Fusion \ PublisherPolicy \ Default \ policy.8.0.msvcm80__b03f5f7f11d50a3a C: \ Windows \ Assembly \ GAC_32 \ msvcm80 \ 8.0.50727.3053__b03f5f7f11d50a3a C: \ \ \ \ \ 050; .50: f3_50_f: Windows \ сборка \ GAC \ msvcm80 \ 8.0.50727.3053__b03f5f7f11d50a3a

Обновление № 2: это же исключение возникает, когда службаразмещены в производстве на IIS 6 / Windows Server 2003.

Обновление № 3: 32-разрядная сборка .NET стороннего производителяStreamBase API:

sbclient.dll (управляемый)monitor.netmodule (управляемый)dotnetapi.dll (неуправляемый)pthreads-vc8.dll (неуправляемый)

Обновление № 4: добавлены манифесты без успеха:

Проверено, что dotnetapi.dll и pthreads-vc8.dll имеют RT_MANIFEST. Сборка sbclient.dll .NET не имела манифестаУдален sbclient.dll из GACЗарегистрированный sbclient.dll для проверки пропускаДобавлен манифест черезmt.exe как для sbclient.dll, так и для monitor.netmoduleБыл добавлен проверенный манифест и ожидаемые файлы были загружены во время тестирования (через Visual Studio - окно отладочных модулей)То же BadImageFormatException генерируется в BackgroundWorker.OnDoWork (), и стек вызовов отображает вызов dotnetapi.dll ... DefaultDomain.Initalize ().

Я проверил, что msvcm80.dll не имеет манифеста, я считаю, что это единственный загруженный файл, который не имеет манифеста :)

Интересная находка

Когда я загружаю monitor.netmodule врефлектор, это говорит:

'monitor.netmodule' не содержит манифеста сборки.

Несмотря на то, что он отображает ошибку, Reflector все еще может разобрать управляемый код.

Ответы на вопрос(7)

Ваш ответ на вопрос