J'ai créé une solution dans Visual Studio 2008 sur Windows 7, 64 bits.
Ça fonctionne. p>
Lorsque je le déplace sur une autre machine, gagnez aussi 7, 64 bits, il s'est écrasé avec presque aucune information. P>
Le problème d'origine était ceci: p>
appel était rejeté par callee p>
J'ai ensuite implémenté cette solution: p>
Comment correctement gettypefromProgid pour Visual Studio 2008 P>
Cependant, mon problème est maintenant que lorsque j'exécute l'exécutable sur une autre machine, le programme est Crashing immédiatement avec les informations suivantes: p>
using System; using System.Collections.Generic; using System.Text; using EnvDTE; using EnvDTE80; using EnvDTE90; using System.Runtime.InteropServices; namespace EmailSalesVolumeSolution { public class MessageFilter : IOleMessageFilter { // // Class containing the IOleMessageFilter // thread error-handling functions. // Start the filter. public static void Register() { IOleMessageFilter newFilter = new MessageFilter(); IOleMessageFilter oldFilter = null; CoRegisterMessageFilter(newFilter, out oldFilter); } // Done with the filter, close it. public static void Revoke() { IOleMessageFilter oldFilter = null; CoRegisterMessageFilter(null, out oldFilter); } // // IOleMessageFilter functions. // Handle incoming thread requests. int IOleMessageFilter.HandleInComingCall(int dwCallType, System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr lpInterfaceInfo) { //Return the flag SERVERCALL_ISHANDLED. return 0; } // Thread call was rejected, so try again. int IOleMessageFilter.RetryRejectedCall(System.IntPtr hTaskCallee, int dwTickCount, int dwRejectType) { if (dwRejectType == 2) // flag = SERVERCALL_RETRYLATER. { // Retry the thread call immediately if return >=0 & // <100. return 99; } // Too busy; cancel call. return -1; } int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, int dwTickCount, int dwPendingType) { //Return the flag PENDINGMSG_WAITDEFPROCESS. return 2; } // Implement the IOleMessageFilter interface. [DllImport("Ole32.dll")] private static extern int CoRegisterMessageFilter(IOleMessageFilter newFilter, out IOleMessageFilter oldFilter); } [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] interface IOleMessageFilter { [PreserveSig] int HandleInComingCall( int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo); [PreserveSig] int RetryRejectedCall( IntPtr hTaskCallee, int dwTickCount, int dwRejectType); [PreserveSig] int MessagePending( IntPtr hTaskCallee, int dwTickCount, int dwPendingType); } }
4 Réponses :
Essayez d'impression davantage à partir de l'exception: Vous pouvez également l'utiliser pour attraper toutes les extrémités internes également: P> string except = "Uncaught Exception: ";
while(e != null)
{
except += e.Message + ";\n";
e = e.InnerException;
}
Essayez de joindre un débogueur pour voir quelle ligne se bloque
Le programme fonctionne bien en mode de débogage et de libération sur ma machine, mais lorsque je le déplace vers une autre machine, l'exécutable crache la poubelle ci-dessus
Fwiw, e.tostring () donne le message complet d'exception et StackTrace
Mis à jour, laissez-moi savoir si vous réussissez à joindre le débogueur.
merci beaucoup ce que je fais en ce moment télécharge vs 2008 express
Après avoir téléchargé IW, je vais essayer de compiler avec elle sur l'autre ordinateur et de vous faire savoir
S'il vous plaît essayez ma dernière solution. Et pouvez-vous indiquer une ligne spécifique après avoir attaché un débogueur?
Comment puis-je ajouter VS 9 DTE comme une dépendance?
Je ne sais pas comment vous installez votre application, mais envisagez d'utiliser InstallSheild ou lisant ceci: http://stackoverflow.com/questions/11011088/how-to-include-d Ependaisons-in-configuration -et-déploiement-proj ect
Vous pouvez également essayer de vous abonner au fais cela en haut de appdomain.currentdomaine.unhandleXception code> Evénement:
Méthode principale code> . p> p>
merci, je viens d'essayer cela et d'avoir toujours le même résultat
Si vous avez Visual Studio sur une autre machine, vous pouvez ajouter débogger.break code> la commande pour parcourir le code dans le débogueur. BTW Avez-vous des invocations de code non gérées dans votre application?
Je vous remercie. Je pense que j'ai un code non géré (je ne sais pas ce que c'est, mais je l'ai collé)
Essayez d'ajouter après votre essai ... Catch Block un de plus Catch sans paramètre Catch {MessageBox.Show ("Exception conforme non CLS capturée."); } code>. Au moins nous saurons que nous avons une exception non CLS
La seule solution qui a fonctionné était d'installer Visual Studio. Dès qu'il a été installé, j'ai obtenu exactement l'exception. P>
Tout comme un fyi, une Appcrash avec un module de défaut de kernelbase.dll signifie qu'une exception a été lancée pendant que vous êtes là où à l'intérieur de Kernelbase.dll. En C #, cela signifie généralement qu'un de vos appels interopest a quelque chose qui ne va pas avec elle. Personnellement, j'ai eu cela que cela me soit arrivé en raison d'une typographie dans une signature de méthode, à partir de la capture d'écran de l'erreur une fois que vous avez Visual Studio, il ressemble peut-être un GUID invalide pour votre objet COM (peut-être qu'il n'est pas enregistré)
@Merci tellement pour votre conseil! Cela serait-il vrai même si cela fonctionne sur ma machine et non sur une autre machine?
Votre DLL peut ne pas être inscrit sur la machine cliente. Vérifiez la DLL que vous appelez l'objet COM pour et faire un regsvr32 youcomdllname.dll code> en tant qu'administrateur. Selon si vous utilisez une application 32 bits ou 64 bits, vous devrez peut-être utiliser la copie de regsvr32 dans
C: \ windows \ system32 code> ou dans
c: \ windows \ sswow64 code> (sur une manière en arrière, la version 64 bits est dans System32 et la version 32 bits est en SYSWOW64)
@DANPE Quelle est la solution exacte s'il vous plaît donnez-moi.
Votre DLL peut ne pas être enregistré sur la machine cliente. Vérifiez la DLL que vous appelez l'objet COM pour et faire un Si vous obsertez simplement la DLL de votre ordinateur ne fonctionne pas exécuter walker de dépendance sur le programme de votre ordinateur. Lorsque vous obtenez toutes les DLL que votre programme touche votre programme, vérifiez que l'ordinateur client ne manque aucun. La DLL que vous appelez peut être là, mais une DLL regsvr32 youcomdllname.dll code> dans une invite de commande administrative (clic droit sur l'icône d'invite de commande et do
exécutez en tant qu'administrateur code> . Selon si vous utilisez une application 32 bits ou 64 bits, vous devrez peut-être utiliser la copie de regsvr32 dans
c: \ windows \ system32 code> ou dans
c: \ windows \ sswow64 < / code> (sur une manière en arrière, la version 64 bits est dans System32 et la version 32 bits est en SYSWOW64) P>
La dépendance Walker peut vous montrer quelle DLL est manquante, comparez simplement la liste qu'il vous donne sur votre machine à la liste que vous avez sur l'autre machine. Assurez-vous de faire Profile-> Démarrer le profilé Code> Lorsque vous exécutez le walker de la dépendance car il ne choisira pas de la DLL limitée tardité comme votre COM DLL jusqu'à ce que vous l'exécutions dans le profileur.
Scott, je suis toujours en attente que l'utilisateur se déconnecte de la machine afin que je puisse jouer avec elle, mais si vous soupçonnez-vous que c'est le problème étant donné qu'il ne fonctionne pas sur deux ordinateurs qui n'ont pas encore la version complète de Visual Studio installées encore Cela fonctionne sur le mien qui a une version complète de VS installée?
Je trouve cela peu probable. Il est beaucoup plus probable qu'il existe une DLL tiers qui n'a rien à voir avec VS Votre code s'appuie sur celui-ci a été installé sur votre ordinateur mais n'est pas installé sur la machine du client. (Si la DLL Votre programme s'appuie sur Écrit (ou au moins une fois satisfait une fois) dans VS sur votre machine également, je le sais que les réagissions automatiques de la DLL pour tester si vous avez des paramètres définis. Cela pourrait être de la manière dont il s'est enregistré). Ou peut-être c'était une case à cocher sur un installateur .msi vous aviez vérifié que votre client n'a pas (exemple: le SQL SDK est livré avec SQL Server, mais est une installation optionnelle)
Merci encore Scott pour tellement d'aide à ce sujet. Il n'y avait pas d'installateur, je viens de copier l'ensemble du dossier de débogage sur une autre machine
Pouvez-vous pointer sur une ligne spécifique après avoir attaché un débogueur?