2012-03-01 2 views
0

Уважаемый интернет-сообщество.Для сторонней библиотеки требуется 32-разрядное приложение?

Я изучаю проблему для клиента, у которого возникают проблемы с переносом на 64-разрядные клиентские компьютеры под Windows 7. Одна из их программ зависит от сторонней библиотеки, которая поднимает шум, если текущее приложение не является 32-битным.

MyClientApplication вызывает MyThirdPartyLibrary0.dll, который, в свою очередь, вызывает MyThirdPartyLibrary1.dll. В 32-битной среде я обычно делал это:

var myObject = New MyThirdPartyLibrary0.MyClass(); myObject.MyMethod();

И все отлично.

На 64-битной среде, я получаю следующее исключение:

System.BadImageFormatException: Could not load file or assembly 'MyThirdPartyLibrary1.dll' or one of its dependencies. is not a valid Win32 application. (Exception from HRESULT: 0x800700C1) 
File name: 'MyThirdPartyLibrary1.dll' 
    at MyThirdPartyLibrary1.MyInnerClass.MyMethod() 
    at MyThirdPartyLibrary0.MyClass.MyMethod() 
    at MyApplication.Program.Main(String[] args) 

На моем клиенте разработчика я запускаю тот же код в тесте NUnit и производит то же BadImageFormatException; если я запустил его с помощью Microsoft.VisualStudio.QualityTools.UnitTestFramework, тогда он будет работать нормально. Я предполагаю, что это потому, что VS 2010 - это 32-битное приложение?

Я замечаю, что при использовании Microsoft.VisualStudio.QualityTools.UnitTestFramework Я не могу запускать тесты, если переключусь на использование Patform = 64 бит - кажется, что эти тесты не могут выполняться в этих условиях.

Я не смог «заставить» MyApplication успешно выполнить MyMethod. Я подозреваю, что основная причина в том, что MyThirdPartyLibrary1.dll не может работать в контексте 64-битного приложения, но я не могу понять, как «заставить» его запускать в 32-битном контексте: «Переключение между платформой = любой процессор» , x86 и 64-бит все дают одинаковое исключение BadImageFormatException, равно как и игра с настройками совместимости. Кроме того, опция «Устранение неполадок совместимости» предполагает запуск приложения в режиме Windows XP (SP2): тот же результат.

Мне кажется, что мне нужно найти способ скомпилировать MyApplication как бинарное 32-битное приложение или что-то в этом роде, но я не могу понять, как это сделать.

Любой помощь будет оценена, KS

ответ

2

Вы не можете загрузить 32-разрядную сборку в бегущем 64-разрядном процесс, или 64-разрядную сборку в бегущем 32-разрядном процесс, даже в отдельный домен приложения. Причина, по которой вы видите, что она работает с NUnit, заключается в том, что NUnit бегун - это 32-битное приложение. Я столкнулся с аналогичной проблемой, когда моя сборка не запускалась внутри NUnit из-за ссылки на 64-разрядную сборку на C++. Я дважды скомпилировал свой код на C++ и динамически загружал нужную библиотеку на основе проверки sizeof(int) в небезопасном контексте (полный взлом).

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

+1

Благодарим вас за ответ. Что касается бегуна NUnit; Я подозревал, как много. Думаю, я буду искать 32-битную оболочку (вздох!), Если сторонний поставщик не сможет предоставить 64-битную версию. –

Смежные вопросы