PInvoke в другую отдельную память и threadsafe

1

Мое приложение находится на С#, а 3-я сторона, с которой я работаю, - это закрытый источник C++. Я имею доступ к сторонней библиотеке как .dll и .h файлы.

Я получаю доступ к коду с помощью Platform Invoke

При использовании сторонней библиотеки я начинаю с вызова функции InitBase(...) которая создает и возвращает структуру Base. Но разрешено иметь только одну базу за раз.

Одна база может выполнять только одну задачу. Я хочу иметь возможность выполнять несколько задач за раз (многопоточность).

Можно ли вызвать библиотеку 3. party с платформой invoke из разных потоков, где потоки не мешают друг другу в сторонней библиотеке? Я бы предпочел, чтобы каждый поток имел полный отдельный патрон памяти в сторонней библиотеке, поэтому с точки зрения сторонних библиотек он остается единственным экземпляром существующего.

Если это невозможно, мне нужно запустить мое приложение в нескольких процессах, как единственный способ сделать его "многопоточным".

  • 0
    Посмотрите здесь stackoverflow.com/questions/4225064/… а здесь stackoverflow.com/questions/12530022/… . Может найти что-то интересное в комментариях.
  • 0
    Кстати, вы можете написать оболочку на C ++, например, чтобы загрузить dll для себя. Это не так сложно, и некоторый код можно найти также. Загрузите его в память, организуйте, разрешите ссылки и т. Д. Все для себя и не используйте LoadLibrary.
Теги:
multithreading
thread-safety
pinvoke
shared-memory

1 ответ

0
Лучший ответ

Когда я прочитаю ваш вопрос, библиотека ограничивает вас одним экземпляром этого объекта на экземпляры DLL. Различные потоки в одном процессе будут в обычном порядке использовать один и тот же экземпляр библиотеки DLL. Таким образом, казалось бы, потоки вам не помогут.

Одним из возможных решений было бы использование нескольких процессов и IPC, как вы сами предлагаете.

Другой вариант - загрузить отдельные экземпляры DLL в этот процесс. Загрузчик будет повторно использовать библиотеки DLL, если они имеют одинаковое имя. Если вы делаете несколько копий DLL, загрузчик не сможет повторно использовать уже загруженные экземпляры. Вы должны иметь возможность использовать hardlinks, чтобы избежать необходимости использовать дополнительное пространство на диске для каждой копии, хотя я никогда не делал этого сам. Всякий раз, когда я это делал, я скопировал DLL в временную папку и не беспокоился о дисковой памяти.

Этот многократный метод экземпляра DLL не всегда работает (вещи могут быть разделены иначе, чем глобальные переменные), но это часто происходит. Вам будет полезно обратиться к разработчику DLL за помощью.

  • 0
    Я бы предпочел не использовать несколько процессов, потому что IPC всегда ад, чтобы получить право. Как вы используете «жесткую ссылку» и как вы можете обойти проблему с копированием библиотек DLL, а затем вызывать их из платформы?
  • 0
    К сожалению, это не всегда безопасно. Потому что библиотеки DLL могут использовать некоторые общие ресурсы, такие как мьютексы и файлы блокировки, и простое копирование и загрузка их несколько раз может сломать его. Так что надо быть очень осторожным с этим. Может быть внешняя причина, по которой «InitBase» всегда возвращает один и тот же объект.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню