MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как подключить две версии одной библиотеки в Any CPU"
Answer 1205256
Можно так:
Добавляем ссылку на библиотеку.
У ссылки ставим Копировать локально = False
Делаем так, чтобы две версии библиотеки лежали в подкаталогах x86 и x64 выходного каталога. Т.е. структура должна быть такой:
MyProject\MyProject.csproj
MyProject\bin\Debug\MyProject.dll
MyProject\bin\Debug\x86\MyLib.dll
MyProject\bin\Debug\x64\MyLib.dll
- В коде делаем следующее:
using System; using System.IO; using System.Collections.Generic; using System.Text; using System.Reflection; namespace ConsoleApp1 { class MyClass { static MyClass() { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; } private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { AssemblyName name = new AssemblyName(args.Name); string basepath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); if (Environment.Is64BitProcess) basepath = Path.Combine(basepath, "x64"); else basepath = Path.Combine(basepath, "x86"); Assembly ret = Assembly.LoadFrom(Path.Combine(basepath, name.Name + ".dll")); return ret; } public static void Method() { //работа с библиотекой } } }
Суть способа в том, чтобы перехватить событие разрешения сборки и подсунуть разную версию в зависимости от разрядности. Обязательное условие - чтобы непосредственно в каталоге с программой не было никакой версии MyLib.dll, т.е. стандартный алгоритм разрешения должен завершиться с ошибкой. Иначе наш обработчик не запустится. Обработчик должен быть прицеплен до объявления любой переменной из библиотеки, поэтому он помещен в статическом конструкторе. Таким образом это можно заставить работать с AnyCPU.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.