2015-02-12 5 views
0

Мое решение в Visual Studio 2012 имеет три проекта. Проект WinForms и два проекта VC++ (Библиотеки). Первоначально все разработки были выполнены на 32-битной Windows 7 Professional. Но недавно моя система была обновлена ​​до 64-разрядной версии Windows 7 Professional.Изменение с 32 до 64 бит

Мое приложение успешно работает и успешно работает с платформой Active Solution, установленной в AnyCPU. Но когда приложение запускается, и я выполняю какое-либо действие, которое вызывает вызов базовой библиотеки VC++, приложение вылетает с FileNotFoundException для dll.

Должен ли я изменить платформу активных решений на x64? Или это прекрасно, чтобы оставить это как есть.

Я попытался сменить платформу активных решений на x64. Но dll не создает. Я получаю error LNK2019: unresolved external symbol

Я никогда раньше не использовал 64-бит. Что мне нужно сделать для создания моего приложения?

Символы, которые не найдены, присутствуют в третьем проекте VC++, который является статической библиотекой.

WinForms зависит от dll, а dll зависит от статической библиотеки lib.

Update:

При конфигурации сборки установлен в AnyCPU, я получаю System.BadImageFormatException. По дополнительной информации, он говорит, что не удалось загрузить файл или сборку dll_name,..... Была предпринята попытка загрузить программу с неправильным форматом.

+0

Почему бы вам не рассказать нам больше об ошибке, которую вы получаете. Какой символ не разрешен? –

+0

Если нет убедительной причины для запуска приложения в 64-разрядном режиме, скорее всего, будет проще оставить его как 32-разрядный. Это означает установку платформы Active Solution на x86. –

+1

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

ответ

1

Выбор платформы AnyCPU создает независимый от процессора .NET-код. Это означает, что он будет работать как x86-код на 32-разрядной Windows, но как x64-код в 64-битной Windows.

Visual C++ не имеет эквивалента AnyCPU. Эти проекты должны быть либо 32-битными, либо 64-битными. Предположительно, ваше решение сконфигурировано для их создания в виде 32-разрядных библиотек DLL при выборе AnyCPU. Это означает, что на 64-битной машине код .NET будет работать как 64-разрядный, но библиотеки DLL по-прежнему будут 32-разрядными, а поскольку 64-разрядный процесс не может загрузить 32-разрядную DLL, он выиграл Не работай.

Вы можете исправить это либо, установив платформу активного решения на x64, либо установив ее на x86. Если у вас нет конкретной причины, по которой вы хотите, чтобы код работал как x64 (например, для большего размера адресного пространства, или он плохо работает на 32-битной платформе), обычно проще выбрать x86, поскольку это будет работать как на 32-битной, так и на 64-разрядной Windows, и не требует каких-либо изменений в существующем коде, первоначально разработанном для 32-разрядной Windows.

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

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