Question

Je veux que ma demande soit distribuable comme fichier .exe unique mais je veux être en mesure d'obtenir de beaux rapports d'erreur avec les numéros de ligne de code source (l'application envoie simplement email avec exception.ToString() et certains supplémentaires lorsque l'information exception non gérée se produit).

Est-il possible d'intégrer pdb dans l'assemblage?

Était-ce utile?

La solution

Utiliser minidumps au lieu de "exception.ToString ()". Il vous donnera beaucoup plus d'informations et n'a pas besoin de l'pdb être distribué avec le .exe.

Lien utile: Post-Mortem Débogage votre application avec minidumps et Visual Studio .NET

Autres conseils

J'utilise le gestionnaire d'AssemblyResolve suivante, puis l'incorporation à la fois dll et pdb de tous les assemblages. Vous pouvez définir cela comme quelque chose qui va première chose que dans l'application avant les dépendances sont nécessaires.

    private static void SetupEmbeddedAssemblyResolve()
    {
        // Based on http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx
        AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
        {
            var name = args.Name;
            var asmName = new AssemblyName(name);

            // Any retargetable assembly should be resolved directly using normal load e.g. System.Core issue: 
            // http://stackoverflow.com/questions/18793959/filenotfoundexception-when-trying-to-load-autofac-as-an-embedded-assembly
            if (name.EndsWith("Retargetable=Yes"))
            {
                return Assembly.Load(asmName);
            }

            var executingAssembly = Assembly.GetExecutingAssembly();
            var resourceNames = executingAssembly.GetManifestResourceNames();

            var resourceToFind = asmName.Name + ".dll";
            var resourceName = resourceNames.SingleOrDefault(n => n.Contains(resourceToFind));

            if (string.IsNullOrWhiteSpace(resourceName)) { return null; }

            var symbolsToFind = asmName.Name + ".pdb";
            var symbolsName = resourceNames.SingleOrDefault(n => n.Contains(symbolsToFind));

            var assemblyData = LoadResourceBytes(executingAssembly, resourceName);

            if (string.IsNullOrWhiteSpace(symbolsName))
            { 
                Trace.WriteLine(string.Format("Loading '{0}' as embedded resource '{1}'", resourceToFind, resourceName));

                return Assembly.Load(assemblyData);
            }
            else
            {
                var symbolsData = LoadResourceBytes(executingAssembly, symbolsName);

                Trace.WriteLine(string.Format("Loading '{0}' as embedded resource '{1}' with symbols '{2}'", resourceToFind, resourceName, symbolsName));

                return Assembly.Load(assemblyData, symbolsData);
            }
        };
    }

    private static byte[] LoadResourceBytes(Assembly executingAssembly, string resourceName)
    {
        using (var stream = executingAssembly.GetManifestResourceStream(resourceName))
        {
            var assemblyData = new Byte[stream.Length];

            stream.Read(assemblyData, 0, assemblyData.Length);

            return assemblyData;
        }
    }

Vous pouvez écrire un exécutable stub, qui contient des ressources intégrées, à la fois votre exécutable réel et son fichier pdb. Lors du démarrage de l'exécutable Staub, il extrait le vrai exécutable et l'pdb dans un répertoire temporaire et la lance.

Tout comme certains installateurs ou d'autres applications font.

Je ne sais pas si cela vaut l'effort supplémentaire cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top