У меня есть две сборки, которые содержат одинаковое пространство имен и классы. Один из них является 32-разрядным и называется Assembly_x86.dll, а другой является 64-разрядным и называется Assembly_x64.dll.
Я хотел бы иметь возможность собирать содержащее приложение как AnyCPU и запускать его без ошибок как в 32-, так и в 64-битных ОС. Поэтому мне нужно, чтобы он динамически выбирал правильную ссылку во время выполнения в зависимости от разрядности содержащего процесса. Некоторое время я разбирался с этим и не смог ничего придумать. Я чувствую, что, наверное, упускаю что-то простое.
Моей последней попыткой было добавить ссылки на обе сборки, подключить событие AssemblyResolve и попытаться заменить 64-битную ссылку на 32-битную, если она не сможет загрузить 64-битную версию следующим образом ...
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Assembly assembly = null;
if (args.Name.Contains("assembly_x64"))
{
assembly = typeof(x86_alias::TypeName).Assembly;
}
return assembly;
}
Что приводит к следующему исключению:
The located assembly's manifest definition does not match the assembly reference.
Буду очень признателен за любые полезные советы. Заранее спасибо.
Что касается некоторых комментариев ниже, я думаю, что, возможно, я плохо справился с описанием своей цели. Позвольте мне уточнить. Например, в этих сборках есть только один метод, который я хотел бы вызвать - MyClass.MyMethod.
Если я собираю приложение только со ссылкой на 32-разрядную сборку и устанавливаю его на 32-разрядную машину, оно работает нормально. Точно так же, если я соберу его со ссылкой на 64-битную сборку и установлю на 64-битную машину, все будет хорошо. Однако моя цель - не иметь двух отдельных сборок приложения. Если я выполняю развертывание на 32-битной машине, я бы хотел, чтобы он вызывал MyClass.MyMethod в 32-битной сборке, а если я развертывал на 64-битной машине, я хотел бы, чтобы он вызывал MyClass.MyMethod в 64-битной сборке.
Если сборки имели одинаковое имя (и версию, культуру, publickeytoken), я думаю, что это может просто сработать и подобрать правильную версию. Однако, поскольку имена сборок отличаются, это не так. Так вот как я пришел к выводу, что мне нужно поменять ссылку во время выполнения.