刷新由 DllImport 充电的 dll
Refresh dll charged by DllImport
我正在为我的 C# 项目使用 API。我还有一个安装程序,用于在 4.7 版上设置可执行文件(名为 uEye)。
我的问题是:
- 我的电脑上有 uEye 4.3 版
- 我启动了我的应用程序,我遇到了一个错误"wrong version"
- 我开始设置
- 安装程序检测到我没有 4.7 版本
- 安装4.7版本
- 我启动了我的应用程序,但在我重新启动之前我仍然遇到错误
我在 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是不是使用了一种缓存?
在这种情况下,我该如何刷新它?
谢谢
I wonder if DllImport does not use a kind of cache?
确实有缓存。非托管 DLL 在您的应用程序第一次调用该库中的函数时加载。此时 DLL 已加载到您的 .net 进程中,并且它将保持加载状态直到该进程终止。当您重新启动进程时,非托管 DLL 在调用第一个需要该 DLL 的函数时再次加载。
您遇到的问题是,当安装程序尝试更新 DLL 时,该 DLL 被加载到另一个进程中。在进程中加载 DLL 时,无法修改其文件。因此,您的安装程序无法立即修改磁盘上的文件,而是将更新推迟到下一次重新启动。如果您的安装程序写得很好,那么它应该会提示用户需要重新启动才能完成安装。
简而言之,这里的行为是符合预期的,真的没有什么可以做的了。当您的程序打开时,DLL 根本无法更新。
我正在为我的 C# 项目使用 API。我还有一个安装程序,用于在 4.7 版上设置可执行文件(名为 uEye)。
我的问题是:
- 我的电脑上有 uEye 4.3 版
- 我启动了我的应用程序,我遇到了一个错误"wrong version"
- 我开始设置
- 安装程序检测到我没有 4.7 版本
- 安装4.7版本
- 我启动了我的应用程序,但在我重新启动之前我仍然遇到错误
我在 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是不是使用了一种缓存? 在这种情况下,我该如何刷新它?
谢谢
I wonder if DllImport does not use a kind of cache?
确实有缓存。非托管 DLL 在您的应用程序第一次调用该库中的函数时加载。此时 DLL 已加载到您的 .net 进程中,并且它将保持加载状态直到该进程终止。当您重新启动进程时,非托管 DLL 在调用第一个需要该 DLL 的函数时再次加载。
您遇到的问题是,当安装程序尝试更新 DLL 时,该 DLL 被加载到另一个进程中。在进程中加载 DLL 时,无法修改其文件。因此,您的安装程序无法立即修改磁盘上的文件,而是将更新推迟到下一次重新启动。如果您的安装程序写得很好,那么它应该会提示用户需要重新启动才能完成安装。
简而言之,这里的行为是符合预期的,真的没有什么可以做的了。当您的程序打开时,DLL 根本无法更新。