C # DLLImport вызывает слишком много операций ввода-вывода - PullRequest
3 голосов
/ 28 марта 2012

У меня есть программа на C #, которая вызывает DLL C ++ с использованием DLLImport (stdcall).

Но с помощью Process Monitor я обнаружил, что каждый раз, когда я вызываю функцию в DLL C ++, она вызывает три операции ввода-вывода, чтобы открытьФайл DLL, прочитайте его и закройте.

IO operations Функция в C ++, которую я вызываю, является статической.У меня нет источника DLL C ++, чтобы изменить его.Что я могу сделать, чтобы избежать этих чрезмерных операций ввода-вывода?Могу ли я использовать DLLImport для загрузки DLL из памяти вместо файла?Есть предложения?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2012

Анализ, представленный в вашем вопросе, просто неверен. Если бы это было правильно, то DllImport было бы бесполезно.

Нет, когда вы вызываете функцию, импортированную с помощью p / invoke, загружаемая DLL остается загруженной. Система p / invoke не загружает и не выгружает библиотеки DLL при каждом вызове импортированных функций.

1 голос
/ 17 апреля 2012

Попробуйте явно загрузить DLL, а затем сделайте ваш звонок. Сохраните указатель на библиотеку DLL и выгрузите ее перед закрытием приложения.

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);


IntPtr pDll = LoadLibrary("library.dll");

FreeLibrary(pDll);
...