Pergunta

Eu quero meu aplicativo para ser distribuído como um arquivo .exe único , mas eu quero ser capaz de obter relatórios de erros agradáveis ??com números de linhas de código-fonte (a aplicação simplesmente envia e-mail com exception.ToString() e alguns adicional informações quando não manipulado exceção ocorre).

Existe alguma maneira de PDB incorporar em conjunto?

Foi útil?

Solução

Use minidespejos em vez de "exception.ToString ()". Ele lhe dará muito mais informações e não precisa do PDB para ser distribuído com o .exe.

Ligação útil: depuração post-mortem a sua aplicação com Minidumps e

Outras dicas

Eu tenho usado o seguinte manipulador AssemblyResolve e depois incorporar tanto dll e pdb de quaisquer assembléias. Você pode configurá-lo como qualquer coisa que é executado a primeira coisa na aplicação antes são necessários dependências.

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

Você poderia escrever um executável stub, que contém como recursos incorporados, tanto o seu executável real e seu arquivo PDB. Ao iniciar o executável Staub, ele extrai o executável real eo APO em um diretório temporário e lança-lo.

Assim como alguns instaladores ou outros aplicativos fazer.

Eu não tenho certeza se vale a pena o esforço extra embora.

scroll top