Программа x86 хочет получить доступ к AnyCpu вместо x86

У меня проблема с настройкой компилятора AnyCPU vs x86, но, если я правильно понимаю, моя проблема, похоже, наоборот, как обычно.

В настоящее время все находится на 64-разрядной машине Win 7 с Visual Studio 2010. Речь идет о приложении Dot.NET 3.5. Visual Studio находится на английском языке, но часть ошибки связана с немецким языком, который является языком ОС.


Проект E: основной проект / решение, которое включает 3 подпроекта, 2 как библиотеки DLL и 1 как exe. VB.net 3.5, скомпилированный как x86, так как для доступа требуется OleDB. Первоначально запускался на VS 2008 или даже VS 2005 на 32-битной машине в WinXP.

Проект ADB: vb.net exe, должен иметь возможность запускаться как автономный, и мне нужно иметь доступ к формам из проекта E. Это началось как отдельный проект, которым я был Dot .Net 4.0 в VS 2010, но я думаю, что он все еще был на 32-битной машине / WinXP, если это актуально.
Требуется OledDB для MS Access, поэтому автономный exe должен быть x86.
Но если Я компилирую его как x86 (Project Properties> Compile> Advanced Compile Options) как часть решения, я получаю ошибку сборки (см. Ниже). Если я перейду на AnyCPU, он будет работать как часть решения, включая доступ к OleDB (что должно означать, что это x86, верно?), Но автономная версия больше не может использовать OleDB (что означает, что это не x86, верно?) .

Проект Au: vb.net DLL, включен в ссылки на E, нет необходимости в OleDB. При компиляции как x86 я получаю ту же ошибку, что и в проекте ADB. Работает, если скомпилирован как AnyCPU. Был добавлен в VS 2008 на 32-битной машине.

Проект S: C # DLL, OleDB не требуется. Скомпилировано как x86 и включено в ссылки E, это работает. Это загрузка из Интернета, была добавлена ​​в VS 2008 на 32-битной машине.

Ошибка сборки следующая:
Die Datei oder Assembly "file: /// X: /Entw/E/VB.net/ADB/bin/Debug/ADB.exe" oder eine Abhängigkeit davon wurde nicht gefunden. Es wurde versucht, eine Datei mit einem falschen Format zu laden.
Переведено:
Не удалось загрузить файл или сборку "XYZ" или одну из их зависимостей. Была сделана попытка загрузить программу с неправильным форматом.

Ошибка OleDb, которую я получаю при запуске ADB в качестве автономного AnyCPU, выглядит следующим образом:
Der 'Microsoft.Jet.OLEDB.4.0' -Provider ist nicht auf dem lokalen Регистрация компьютера.
Это обычное предупреждение об ошибке 64-битного JET:
Поставщик Microsoft.Jet.OLEDB.4.0 не зарегистрирован на локальном компьютере.

Теперь, насколько я понимаю, обычно, если бы основным проектом был AnyCPU, а подпроект был конкретным, я бы получил ошибку сборки, поскольку он попытался бы получить доступ к x86 из AnyCPU, который в этом случае был бы x64. Но здесь я пытаюсь получить доступ к x86 с x86, что не работает, но доступ к AnyCpu (который должен быть x64) с x86 работает?

При необходимости я могу предоставить дополнительную информацию и все файлы конфигурации и т. Д.

Прошу прощения, если я написал это сбивающе с толку, но я очень запутался в этом вопросе.


person Mano    schedule 11.01.2013    source источник


Ответы (2)


Вам следует избегайте использования параметра AnyCPU.

Но я предполагаю, что ваше решение настроено неправильно. В Visual Studio 2010 щелкните решение правой кнопкой мыши и выберите «Свойства» («Eigenschaften»). Выберите «Свойства конфигурации» («Konfigurationseingenschaften») и убедитесь, что все проекты будут построены как x86.

Если вы планируете предоставить 64-разрядную версию своего приложения, я предлагаю создать другие профили сборки. Это можно сделать, щелкнув «Диспетчер конфигураций» в свойствах решения. В разделе «Active Platform Configuration» выберите «‹ New ... ›», выберите «x64», скопируйте настройки из «x86» и включите «Create new project platform». Затем просмотрите список и убедитесь, что все проекты построены как x64 в этой конфигурации.

person Carsten    schedule 11.01.2013
comment
Следует избегать AnyCPU для EXE, для сборок следует использовать AnyCPU: "AnyCPU is still incredibly valuable for DLLs (you may not always know what processes it will be loaded into)" - person Matt Wilko; 11.01.2013
comment
Вам следует избегать AnyCPU для всех сборок, которые ссылаются на сторонние библиотеки, что имеет место в этом вопросе. В этом случае OleDb привязывается к DLL AnyCPU. Ссылка на него на машине x86 должна работать, но ссылка на нее в системах x64 не будет! AnyCPU следует рассматривать только для библиотек, которые ссылаются на библиотеки, скомпилированные с AnyCPU. - person Carsten; 11.01.2013
comment
Свойства решения ›Свойства конфигурации› все установлено на x86. (Хотя на самом деле для разных подпроектов по-прежнему установлены соответствующие значения, указанные выше). Проблема в том, что если я избегаю AnyCpu (например, использую x86), я получаю ошибку компилятора (Не удалось загрузить файл или сборку XYZ или одну из ее зависимостей. Была сделана попытка загрузить программу с неправильным форматом). - person Mano; 11.01.2013
comment
@MattWilko У меня все еще проблема. Кажется, все, что указано выше, настроено правильно, но мне все равно нужно установить для проекта ADB значение AnyCPU, если я хочу построить все решение. - person Mano; 16.01.2013
comment
@mano - мое предположение заключается в том, что у вас есть ссылка на dll (возможно, третья часть сборки) в вашем решении, которое настроено для x64, и вы пытаетесь использовать x86? - person Matt Wilko; 16.01.2013
comment
@MattWilko Хм, интересная идея. Но если я создаю автономный ADB, то мне нужно переключиться на X86 (для OleDB), и он компилируется, поэтому я не верю, что это проблема. Другая возможность - открыть проект на ПК только с x86 и посмотреть, изменится ли это что-то. - person Mano; 17.01.2013
comment
Если я открою его на ПК x86 (VMWARE старого ПК), ADB потерял параметр AnyCPU, который я изменил на x86, после чего он работал в среде x86. Но возвращаясь к x64, у меня снова та же проблема. Сейчас я удаляю как можно больше из ADB, исключая и комментируя элементы, указывающие на удаленные файлы. У меня осталось 2 класса (что должно быть в порядке) и одна форма (основная форма, возможно, проблема) и некоторые файлы ресурсов (значки / bmps). Есть ли простой способ скопировать форму, не перетаскивая за собой закулисный материал, но с копированием свойств местоположения, размера, текста и т. Д.? - person Mano; 17.01.2013

Хорошо, я нашел это сейчас. Проблема в том, что сообщение об ошибке было бесполезным.

Поиск в выводе показал, что это проблема с resgen.exe в определенной форме.
БОЛЬШЕ копания в Google и командной строке VS показали, что он каким-то образом пытается получить неправильный System.Forms.dll: http://connect.microsoft.com/VisualStudio/feedback/details/532584/error-when-compiling-resx-file-seems-related-to-beta2-bug-5252020 и понимая, что да, я использовал ImageList на та форма.

person Mano    schedule 23.01.2013