Как развернуть библиотеку C #, которая использует библиотеки C ++ / CLI - PullRequest
1 голос
/ 05 апреля 2019

У меня есть библиотека C #, которая создается с использованием AnyCPU, но зависит от нескольких библиотек C ++ / CLI. Я скомпилировал C ++ / CLI для x86 и x64 Windows. Кажется, что я могу добавить только одну ссылку на библиотеку C ++ / CLI в проект C # (в противном случае файлы перезаписывают друг друга). Я думал, что будет возможно иметь папку x86 и x64, в которой будут жить соответствующие библиотеки. Но когда я попробовал это, я получил исключения времени выполнения из-за невозможности найти библиотеку.

Есть ли способ включить x86 и x64 в мою библиотеку AnyCpu, чтобы вызывающее приложение могло решить, хотят ли они x86 или x64, когда оно развернуто?

1 Ответ

2 голосов
/ 05 апреля 2019

В основном вам нужно сделать следующее:

  • обнаружение архитектуры процесса (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.

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