У меня наконец есть ответ на этот вопрос, который, кажется, работает.
Скомпилируйте 32- и 64-разрядные версии - как управляемые, так и неуправляемые - в отдельные папки. Затем приложение .NET во время выполнения выбирает, из какого каталога загружать сборки.
Проблема с использованием ResolveEvent заключается в том, что он вызывается только в том случае, если сборки не найдены, поэтому легко получить случайно 32-битные версии. Вместо этого используйте второй объект AppDomain, где мы можем изменить свойство ApplicationBase так, чтобы оно указывало на нужную папку. Таким образом, вы получите код вроде:
static void Main(String[] argv)
{
// Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit
// sub-directories.
AppDomainSetup objADS = new AppDomainSetup();
System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
switch (System.IntPtr.Size)
{
case (4): assemblyDir += "\\win32\\";
break;
case (8): assemblyDir += "\\x64\\";
break;
}
objADS.ApplicationBase = assemblyDir;
// We set the PrivateBinPath to the application directory, so that we can still
// load the platform neutral assemblies from the app directory.
objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
AppDomain objAD = AppDomain.CreateDomain("", null, objADS);
if (argv.Length > 0)
objAD.ExecuteAssembly(argv[0]);
else
objAD.ExecuteAssembly("MyApplication.exe");
AppDomain.Unload(objAD);
}
В итоге вы получаете 2 exes - ваше обычное приложение и второе приложение переключения, которое выбирает, какие биты загружать.
Примечание - я не могу взять кредит на детали этого сам. Один из моих коллег подозревал это, учитывая мой первоначальный указатель. Если и когда он зарегистрируется в StackOverflow, я назначу ему ответ