Мое приложение находится на С#, а 3-я сторона, с которой я работаю, - это закрытый источник C++. Я имею доступ к сторонней библиотеке как .dll
и .h
файлы.
Я получаю доступ к коду с помощью Platform Invoke
При использовании сторонней библиотеки я начинаю с вызова функции InitBase(...)
которая создает и возвращает структуру Base
. Но разрешено иметь только одну базу за раз.
Одна база может выполнять только одну задачу. Я хочу иметь возможность выполнять несколько задач за раз (многопоточность).
Можно ли вызвать библиотеку 3. party с платформой invoke из разных потоков, где потоки не мешают друг другу в сторонней библиотеке? Я бы предпочел, чтобы каждый поток имел полный отдельный патрон памяти в сторонней библиотеке, поэтому с точки зрения сторонних библиотек он остается единственным экземпляром существующего.
Если это невозможно, мне нужно запустить мое приложение в нескольких процессах, как единственный способ сделать его "многопоточным".
Когда я прочитаю ваш вопрос, библиотека ограничивает вас одним экземпляром этого объекта на экземпляры DLL. Различные потоки в одном процессе будут в обычном порядке использовать один и тот же экземпляр библиотеки DLL. Таким образом, казалось бы, потоки вам не помогут.
Одним из возможных решений было бы использование нескольких процессов и IPC, как вы сами предлагаете.
Другой вариант - загрузить отдельные экземпляры DLL в этот процесс. Загрузчик будет повторно использовать библиотеки DLL, если они имеют одинаковое имя. Если вы делаете несколько копий DLL, загрузчик не сможет повторно использовать уже загруженные экземпляры. Вы должны иметь возможность использовать hardlinks, чтобы избежать необходимости использовать дополнительное пространство на диске для каждой копии, хотя я никогда не делал этого сам. Всякий раз, когда я это делал, я скопировал DLL в временную папку и не беспокоился о дисковой памяти.
Этот многократный метод экземпляра DLL не всегда работает (вещи могут быть разделены иначе, чем глобальные переменные), но это часто происходит. Вам будет полезно обратиться к разработчику DLL за помощью.