Je développe une application basée sur le plug-in .NET 2.0. Mon application détecte/charge les plug-ins au moment de l'exécution via une inspection System.Reflection des autres assemblys .NET dans un répertoire spécifié. Cela fonctionne très bien. Mon application contient un contrôle PropertyGrid rempli à partir des propriétés [Browsable (true)] présentes dans les plug-ins chargés. Dans ce PropertyGrid, explorables-vrai-propriétés présentent le comportement suivant:.NET: Les types définis par l'utilisateur dans la grille de propriétés provoquent le blocage
- Propriétés des types primitifs/(Bool, chaîne, etc.) charge et nettoyage correctement
- Propriétés des types définis par l'utilisateur (comme un plugin côté défini enum) charger correctement et nettoyer correctement lorsque l'utilisateur ne modifie pas puis au moment de l'exécution.
- Si un utilisateur modifie un type non standard lors de l'exécution (c'est-à-dire change la valeur d'une énumération via PropertyGrid), l'application se bloque à la fermeture. C'est mon problème.
l'aide de Visual Studio .NET 2005 et le réflecteur Red Gate, j'ai pu isoler le suspendre pour le segment de code suivant de Microsoft.Win32.SystemEvents.WindowThreadProc (je travaillais de l'ensemble cru, mais je am 99% sûr que ce soit le bon endroit):
while (flag)
{
if (UnsafeNativeMethods.MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 100, 0xff, 4) != 0x102)
{
goto Label_0072;
}
Thread.Sleep(1);
continue;
Label_0053:
if (msg.message == 0x12)
{
flag = false;
continue;
}
UnsafeNativeMethods.TranslateMessage(ref msg);
UnsafeNativeMethods.DispatchMessage(ref msg);
Label_0072:
if (UnsafeNativeMethods.PeekMessage(ref msg, NativeMethods.NullHandleRef, 0, 0, 1))
{
goto Label_0053;
}
}
Il semble « drapeau » n'est pas à true, d'où mon programme se trouve dans cette boucle pour toujours. J'ai trouvé quelqu'un avec a similar problem at .NET 247, mais sa solution recommandée:
System.Threading.Thread.CurrentThread.SetApartmentState(Threading.ApartmentState.STA)
ne semble pas arranger les choses.
Des pensées?
Merci d'avance.
Merci!J'ai été capable de résoudre le problème. C'était un peu plus compliqué que ne l'indique votre extrait, mais votre message m'a mis sur la bonne voie. Les complications provenaient du fait que ce code a été écrit dans VB.net (pouah - pas ma décision) donc, par habitude, VB.net a essayé de tout rendre facile en cachant le code (ce qui finit par rendre les choses difficiles). J'ai finalement créé ma propre classe "Starter" et édité manuellement le fichier .vbproj dans Textpad pour l'utiliser. Par défaut, VS voulait utiliser la classe My.Application avec laquelle il était difficile de travailler. Voir ci-dessous pour un extrait complet de Starter.vb – Vincent
C'est en gros la même chose que je disais. L'astuce consiste à ajouter (dans VB.NET). –
Absolument - Je ne suis pas habitué à VB.net et j'ai eu du mal à trouver * Sub Main() qui n'est pas aussi facile à trouver qu'en C#. Merci encore! – Vincent