2011-04-03 160 views
0

我的Windows窗體應用程序中有一個奇怪的問題。 有時,DLL的加載時間很長(令人沮喪的是,這是隨機發生的,有時沒有問題) 還有一件事: 這隻發生在Windows 7中(從不在Windows XP中)。預加載非託管dll

dll的加載發生在第一次使用時。

有沒有人有一些建議我可以做的。

是否有可能預加載DLL或給予更高的優先級等? 擁有(裝貨前,也許一些新的安全檢查)7在Windows中更改加載DLL

一些規格:

  • 使用.NET 4.0
  • DLL不在託管代碼(我放在DLL中其中可執行文件的文件夾)


EDIT - 一些更多信息如下:

我使用Bass.dll(http://www.un4seen.com/)並通過.NET API調用它。 該系統運行良好。現在一些用戶已經切換到Windows 7,並且這個問題已經開始隨機發生。

我將代碼展開到一個較小的項目中(以便能夠找到問題)。 在我的一臺電腦上,我能夠看到延遲發生(有時幾秒鐘,有時最多30秒)。 我也問過這個問題在論壇上的這個組件:

http://www.un4seen.com/forum/?topic=12378.0

他們提到以下幾點:

「我可能想到的唯一的事情可能是加載時間組件( dlls) - 因爲它們在需要時被加載(即第一次方法調用到尚未加載的程序集中)。「

一些下面的代碼:

public Form1() { 
     InitializeComponent(); 
     Un4seen.Bass.BassNet.Registration("[email protected]", "XXX"); 
     Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero); 
     Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_BUFFER, 5000); 

    } 

    private void button1_Click(object sender, EventArgs e) { 

     DialogResult result = openFileDialog1.ShowDialog();    
     if(result == System.Windows.Forms.DialogResult.OK){ 
      label1.Text = DateTime.Now.ToString(); 
      int stream = Bass.BASS_StreamCreateFile(openFileDialog1.FileName, 0L, 0L, BASSFlag.BASS_DEFAULT); 
      bool success = Bass.BASS_ChannelPlay(stream, false); // delay occurs here 
      label2.Text = DateTime.Now.ToString(); 
     }   
    } 


新的編輯

我用進程監視器(感謝@Ziplin)來檢查的操作。這裏是延遲:

19:31:11,4886069 TestSound.exe 5048 RegQueryValue HKCU \軟件\微軟\多媒體\音頻\ UserDuckingPreference找不到名稱長度:144

19:31:11,4886281 TestSound。EXE 5048 RegCloseKey HKCU \軟件\微軟\多媒體\音頻SUCCESS

19:31:49,0892107 TestSound.exe 5048線程退出SUCCESS線程ID:5108,用戶時間:0.0000000,內核時間:0.0000000

19:31:54,1185784 TestSound.exe 5048 RegQueryKey HKCU \ Software \ Classes SUCCESS查詢:名稱

+1

您應該試着弄清楚爲什麼需要這麼長時間才能加載 – 2011-04-03 12:10:39

+0

隨機發生的問題很難診斷。但是,當我們既沒有提供源代碼,也沒有解釋DLL *中的代碼*時,診斷問題甚至更難。不要通過預加載DLL來繞過它;解決實際問題。沒有其他Windows 7打破有效代碼的報告。 – 2011-04-03 13:25:20

+0

謝謝,我會編輯更多信息的帖子。 – PKK 2011-04-03 16:55:01

回答

1

嘗試通過互操作使用native LoadLibrary function手動加載dll。通過這種方式,您可以決定自己何時加載庫。

另一個更簡單的方法是在某個時間點(您想要加載的地方)簡單地進行到庫的互操作調用。正如你所說,第一個電話會加載DLL。當然,圖書館必須有一些你可以稱之爲「實際上沒有什麼重大意義」的方法。

+0

我嘗試了第二種方法,不幸的是這不是我可以使用的解決方案,但謝謝。 – PKK 2011-05-23 19:43:29

+0

這不是編程中的問題,而是操作系統與硬件交互的問題。我剛剛經過很多調試/測試後才意識到這一點。 [超級用戶](http://superuser.com/questions/276178/delay-when-playing-soundfiles)如果這將是編程相關這個答案將是一個很好的開始。 – PKK 2011-05-25 09:04:37