MSDN.WhiteKnight - Stack Overflow answers
Ответ на "AnyCpu и ссылка на разные библиотеки в атрибуте DllImport"
Answer 936879
Если конфигурация именно такая, как вы описали: неуправляемые модули для разных архитектур имеют одинаковое имя и расположены в разных подкаталогах каталога с программой, можно использовать функцию SetDllDirectory. При запуске приложения вызовите SetDllDirectory, передав каталог x86 или x64 в зависимости от текущей архитектуры. Объявление P/Invoke на каждую функцию оставить одно, содержащее только имя dll, без пути к подкаталогу. При запуске программа будет искать dll сначала в каталоге программы, затем в каталоге SetDllDirectory, и далее в системных каталогах, поэтому, чтобы все заработало, в каталоге программы dll с таким же именем быть не должно.
[DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetDllDirectory(string lpPathName); static void InitializeDll(){ string path = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; string dir = Path.GetDirectoryName(path); string subdir; if(Environment.Is64BitProcess) subdir = Path.Combine(dir,"x64"); else subdir = Path.Combine(dir,"x86"); SetDllDirectory(subdir); }
Но, более логичное и независимое от WinAPI решение - иметь два объявления P/Invoke на каждую функцию и метод, вызывающий нужный в зависимости от архитектуры.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.