В основном вам нужно сделать следующее:
- обнаружение архитектуры процесса (x86 или x64)
- загрузить нужную библиотеку в соответствии с архитектурой
Получить путь к библиотеке для загрузки в соответствии с архитектурой процесса:
public NativeLibraryLoader(string path32, string path64)
{
if (!File.Exists(path32))
throw new FileNotFoundException("32-bit library not found.", path32);
if (!File.Exists(path64))
throw new FileNotFoundException("64-bit library not found.", path64);
string path;
switch (RuntimeInformation.ProcessArchitecture)
{
case Architecture.X86:
path = path32;
break;
case Architecture.X64:
path = path64;
break;
default:
throw new PlatformNotSupportedException();
}
...
}
Загрузить собственную библиотеку с помощью LoadLibrary
:
/// <summary>
/// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
/// </summary>
/// <param name="lpLibFileName"></param>
/// <returns></returns>
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string lpLibFileName);
Полный пример:
Вы можете проверить aubio.net , оболочку .NET, которую я написал для aubio . Это сборка AnyCPU
, которая загружает библиотеку x86
или x64
в соответствии с текущей архитектурой, на которой она работает.
Вот эти биты, которые вас заинтересуют:
https://github.com/aybe/aubio.net/tree/master/Aubio/Interop
https://github.com/aybe/aubio.net/blob/master/Aubio/AubioNative.cs
Оговорка:
Этот метод объясняет, как загрузить нативную библиотеку, а не управляемую.
Как указано @ Flydog57 , чтобы загрузить управляемую сборку, используйте Assembly.Load
.