Загрузите версию сборки x64 или x86 в зависимости от разрядности ссылающегося приложения - PullRequest
4 голосов
/ 27 мая 2011

У меня есть две сборки, которые содержат одинаковое пространство имен и классы. Один из них является 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), я думаю, что это может просто сработать и подобрать правильную версию. Однако, поскольку имена сборок отличаются, это не так. Так вот как я пришел к выводу, что мне нужно поменять ссылку во время выполнения.

1 Ответ

1 голос
/ 27 мая 2011

Вы можете выполнить проверку ОС как часть установки, а затем развернуть только необходимую DLL на основе ОС.Загрузчик ClickOnce для SQL Server CE делает то же самое.

...