C#DLLImport导致IO操作过多 我有一个C程序,用dLimPurt(STDCLAK)调用C++ DLL。 但是使用进程监视器,我发现每次调用C++ DLL中的函数时,都会导致三个IO操作打开DLL文件,读取并关闭它。p>

C#DLLImport导致IO操作过多 我有一个C程序,用dLimPurt(STDCLAK)调用C++ DLL。 但是使用进程监视器,我发现每次调用C++ DLL中的函数时,都会导致三个IO操作打开DLL文件,读取并关闭它。p>,c#,performance,dllimport,C#,Performance,Dllimport,我调用的C++ DLL中的函数是静态的。我没有C++的DLL的来源来改变它。如何避免这些过多的IO操作?我可以使用DLLImport从内存而不是文件加载dll吗?有什么建议吗?尝试显式加载DLL,然后拨打电话。保持指向DLL的指针,并在关闭应用程序之前卸载它 [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("kernel32.dll")] publ


我调用的C++ DLL中的函数是静态的。我没有C++的DLL的来源来改变它。如何避免这些过多的IO操作?我可以使用DLLImport从内存而不是文件加载dll吗?有什么建议吗?

尝试显式加载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);

你问题中的分析完全不正确。如果它是正确的,那么
DllImport
将是无用的


否,当调用使用p/invoke导入的函数时,加载的DLL保持加载状态。p/invoke系统不会在每次调用导入的函数时加载和卸载dll。

调用普通的“托管”dll时会发生什么行为?有区别吗?或者这是标准方式?这种行为是由CLR还是由DLL本身引起的?尝试调用DLL中的空函数,看看问题是否仍然存在。我真的不认为CLR本身在每次调用DLL中的函数时都会尝试加载DLL。即使进程监视器显示源自
EventProcessor.exe
的一系列
CreateFile
操作,也不一定意味着这是因为调用了
DllImport()
ed方法:可能是该方法出于自身目的在内部调用
CreateFile
QueryNetwork
。请尝试从非托管代码调用相同的方法,如果每次调用函数时都加载DLL,那么从一开始就否定了使用DLL的许多好处。DLL被加载到您的进程空间中,随后的调用会转到那里。这个答案基于这样一个信念:问题中的诊断是正确的。“不是这样的。”戴维谢弗南同意在所讨论的场景中存在一些错误。不应该在每次调用后卸载DLL(如果真是这样的话)。加载它会显式增加DLL引用计数器,从而降低卸载DLL的可能性。