Есть несколько способов справиться с этим. Первый - самый простой, признайте тот факт, что ваше приложение действительно зависит от целевой архитектуры. И что AnyCPU не правильная настройка. очень редко требуется огромное пространство виртуальной адресной памяти, которое вы получаете от x64, тем более что вы также хотите и должны заставить его работать на x86. Так что установите целевой объект платформы EXE на x86, и все готово.
Во-вторых, делается вывод, что это просто проблема развертывания. Все, что вам нужно сделать, это скопировать сборку x64 сборки смешанного режима, когда ваше приложение установлено в 64-разрядной операционной системе, а сборка x86 - в 32-разрядной операционной системе. Вам нужно будет создать проект установки, который позаботится об этом. Самый простой способ - создать два из них. Также единственный способ afaik.
Третий - тот, с колокольчиками на котором он работает в любом случае, тот, о котором вы, несомненно, спрашиваете. Это требует изменений в коде, проекте и установщике. Что вам нужно сделать, это написать событие после сборки, которое создаст две подкаталоги с именами, такими как «x86» и «x64». И скопируйте в них соответствующую версию DLL. Это гарантирует, что CLR не сможет найти эти сборки.
В вашем коде вы должны написать обработчик события для события AppDomain.CurrentDomain.AssemblyResolve. Подпишите его в методе Main () задолго до того, как вы попытаетесь использовать какие-либо типы из сборки. Обработчик событий должен использовать Assembly.LoadFrom () для загрузки правильной сборки из подкаталога на основе значения IntPtr.Size. Это 8, когда вы работаете в 64-битном режиме.
Я должен упомянуть еще один подход, но он, как правило, осуждается в SO. Установите обе сборки в GAC. Все автоматически.