2016-06-24 36 views
1

我正在使用我的C#項目的API。我也有一個安裝程序,它在4.7版上設置可執行文件(名爲uEye)。刷新dll收取DllImport

我的問題是:

  • 我有我的計算機上的uEye版本4.3
  • 我開始我的申請,我有一個錯誤「錯版」
  • 我開始我的設置
  • 設置檢測到我沒有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不使用某種緩存? 在這種情況下,我該如何刷新它?

謝謝

回答

0

不知的DllImport不使用一種緩存?

確實有一個緩存。非託管DLL在您的應用程序首次調用該庫中的函數時加載。此時,DLL將加載到.net進程中,並且它將保持加載狀態,直到該進程終止。當您重新啓動該進程時,非託管DLL將在調用第一個需要該DLL的函數時再次加載。

您遇到的問題是當安裝程序嘗試更新DLL時,該DLL在另一個進程中加載​​。在進程中加載​​DLL時,其文件不能被修改。因此,安裝程序無法立即修改磁盤上的文件,而是推遲更新,直到下次重新啓動。如果你的安裝程序寫得很好,那麼它應該提示用戶需要重新啓動才能完成安裝。

簡而言之,這裏的行爲如預期的那樣,並且可以做的其他事情很少。 DLL在你的程序打開時根本無法更新。

+0

謝謝你的回答,我會在這種情況下添加一條消息來詢問reboot。 –