Pdb incorporar em conjunto
-
19-09-2019 - |
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?
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.