我有一个C#程序,它使用DLLImport(stdcall)调用C ++ dll。
但是使用Process Monitor我发现每次在C ++ dll中调用一个函数时,它都会导致三个IO操作打开DLL文件,读取并关闭它。
我调用的C ++ DLL中的函数是静态的。我没有C ++ DLL的源代码来改变它。我该怎么做才能避免这些过多的IO操作?我可以使用DLLImport从内存而不是文件加载DLL吗?有什么建议吗?
答案 0 :(得分:2)
您的问题中提出的分析完全不正确。如果它是正确的,那么DllImport
将毫无用处。
不,当您调用使用p / invoke导入的函数时,加载的DLL将保持加载状态。 p / invoke系统不会在每次调用导入函数时加载和卸载DLL。
答案 1 :(得分:1)
尝试明确加载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);