我正在为我的C#项目使用API。我还有一个安装程序,可以在4.7版本上设置可执行文件(名为uEye)。
我的问题是:
我在API提供的ddl上使用了反编译器。获取版本的功能是:
public static int GetDLLVersion(out int s32Version)
{
s32Version = IntPtr.Size != 8 ?
uEye.Info.System.ApiWrapper.GetDLLVersion_32() :
uEye.Info.System.ApiWrapper.GetDLLVersion_64();
return 0;
}
[DllImport("ueye_api_64.dll", EntryPoint = "is_GetDLLVersion")]
private static extern int GetDLLVersion_64();
我想知道DllImport是否不使用某种缓存? 在这种情况下,我该如何刷新它?
谢谢
答案 0 :(得分:0)
我想知道DllImport是否不使用某种缓存?
确实存在缓存。第一次应用程序调用该库中的函数时,将加载非托管DLL。此时,DLL将加载到.net进程中,它将保持加载状态,直到该进程终止。当您重新启动进程时,在调用需要该DLL的第一个函数时,将再次加载非托管DLL。
您遇到的问题是,当安装程序尝试更新DLL时,DLL会在另一个进程中加载。在进程中加载DLL时,无法修改其文件。因此,您的安装程序无法立即修改磁盘上的文件,而是将该更新推迟到下次重新引导。如果您的安装程序写得很好,那么它应该提示用户需要重新启动才能完成安装。
简而言之,这里的行为符合预期,而且其他任何事情都无法完成。在程序打开时,DLL无法更新。