2011-04-03 158 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