2011-04-03 3 views
0

J'ai un problème étrange dans mon formulaire d'application de Windows. Parfois, le temps de chargement d'une DLL est très long (la chose frustrante est que cela arrive de manière aléatoire, parfois il n'y a pas de problèmes) Encore une chose: Cela n'arrive que sous Windows 7 (jamais sous Windows XP).Preload non géré dll

Le chargement de la DLL se passe quand il est utilisé la première fois.

Est-ce que quelqu'un a quelques conseils que je pourrais faire.

Est-il possible de précharger la DLL ou de lui donner une priorité plus élevée, etc.? a-chargement dll changé dans Windows 7 (peut-être de nouveaux contrôles de sécurité avant le chargement)

Quelques spécifications:

  • En utilisant .NET 4.0
  • Le dll n'est pas le code managé (I placé la dll le dossier dans lequel les fichiers exécutables sont)


EDIT - Quelques informations supplémentaires:

J'utilise Bass.dll (http://www.un4seen.com/) et je l'appelle via l'API .NET. Le système a bien fonctionné. Maintenant, certains utilisateurs sont passés à Windows 7 et ce problème a commencé à se produire de manière aléatoire.

J'ai cassé le code à un plus petit projet (pour pouvoir trouver le problème). Sur un de mes ordinateurs j'ai pu voir que le retard se produit (parfois quelques secondes, parfois jusqu'à 30 secondes). J'ai aussi posé cette question sur le forum pour ce composant:

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

Ils ont mentionné les points suivants:

« La seule chose que je pourrais penser peut-être le temps de chargement des assemblages (dlls) - comme ils sont chargés chaque fois que nécessaire (c'est-à-dire la première fois qu'une méthode appelle un assembly qui n'a pas encore été chargé). "

Une partie du code ci-dessous:

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(); 
     }   
    } 


NOUVEAU EDIT

I utilisé Process Monitor (grâce @Ziplin) pour vérifier les opérations. Voici le retard:

19: 31: 11,4886069 TestSound.exe 5048 RegQueryValue HKCU \ Software \ Microsoft \ Multimédia \ Audio \ UserDuckingPreference NOM INTROUVABLE Longueur: 144

19: 31: 11,4886281 TestSound.exe 5048 RegCloseKey HKCU \ Software \ Microsoft \ Multimedia \ Audio SUCCES

19: 31: 49,0892107 TestSound.exe 5048 Discussion sortie SUCCES Discussion ID: 5108, User Time: 0,0000000, Temps noyau: 0,0000000

19: 31: 54,1185784 TestSound.exe 5048 RegQueryKey HKCU \ Software \ Classes SUCCESS Requête: Nom

+1

vous devriez probablement essayer de comprendre pourquoi il faut si longtemps pour charger –

+0

Les problèmes qui se produisent de manière aléatoire sont difficiles à diagnostiquer. Mais il est encore plus difficile de diagnostiquer des problèmes lorsque nous ne recevons ni code source, ni une explication de ce que fait le code dans votre DLL *. Ne le piratez pas en préchargeant la DLL; résoudre le problème réel. Il n'y a aucun autre rapport de Windows 7 brisant le code valide. –

+0

Merci, je vais modifier le poste avec plus d'informations. – PKK

Répondre

1

Essayez de charger manuellement la DLL à l'aide du native LoadLibrary function via interop. De cette façon, vous pouvez décider vous-même quand charger la bibliothèque.

Une autre approche plus simple consisterait à effectuer un appel interopérable à la bibliothèque à un moment donné (où vous voulez que le chargement se produise). Comme vous l'avez dit, le premier appel va charger la DLL. Bien sûr, il doit y avoir dans la bibliothèque une méthode que vous pouvez appeler qui ne "fait réellement rien de significatif".

+0

J'ai essayé la deuxième approche, malheureusement, ce n'était pas une solution que je pouvais utiliser, mais merci. – PKK

+0

Ce n'était pas un problème dans la programmation, plutôt un problème dans le système d'exploitation interagissant avec le matériel. Je ne m'en suis pas rendu compte tout de suite, juste après beaucoup de débogage/test. [Superuser] (http://superuser.com/questions/276178/delay-when-playing-soundfiles) Si cela avait été lié à la programmation, cette réponse serait une bonne façon de commencer. – PKK