Использование 32-битной или 64-битной библиотеки DLL в зависимости от разрядности процесса - PullRequest
6 голосов
/ 24 сентября 2011

Мне нужно сослаться на DLL, которая доступна в 2 версиях (одна для 32-битной и одна для 64-битной).Моя цель - создать веб-приложение, которое работает как на 32, так и на 64-битных системах.

Я думал о том, чтобы ссылаться на 32-битную сборку по умолчанию и использовать событие AssemblyResolve для загрузки 64-битной версии (если загрузка 32-битной версии не удалась):

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += _AssemblyResolve;
    // Try LoadAssembly ...
}

static System.Reflection.Assembly _AssemblyResolve(object sender, ResolveEventArgs args)
{
    var path = string.Format(@"...\lib_x64\{0}.dll", args.Name);
    return Assembly.LoadFrom(path);
}

Но даже когда возникает исключение BadImageFormatException, обработчик _AssemblyResolve вызываться не будет.Есть ли другой способ достижения предложенного поведения?

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Самый простой, но менее гибкий с моей точки зрения способ - явно указывать ссылки на платформу в файле csproj, используя Condition:

<ItemGroup Condition=" '$(Platform)' == 'x86' ">
    <Reference Include="MyAssemblyx86">

Также вы можете сделать это динамически, используя Assembly.Load(AssemblyName) перегрузка метода.Параметр имеет тип AssemblyName , который предоставляет свойство AssemblyName.ProcessorArchitecture , которое может быть установлено на Нет, MSIL, X86, X64, IA64, AMD64

Одна вещь, которую вы такжеможно посмотреть это Publisher Policy File функция и аргумент командной строки /platform:processorArchitecture

0 голосов
/ 04 января 2013

См. ответы на этот вопрос для System.Data.SQLite .

Я думаю, что предложенный вами метод должен работать, но вам нужно переместить 32-битную версию, чтобы ее нельзя было найти по умолчанию, поэтому для этой dll всегда вызывается _AssemblyResolve. Это всего лишь предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...