我想我的应用程序是可分配为一个.exe文件 ,但我希望能够获得源代码行数友好的错误报告(应用程序只发送电子邮件exception.ToString()
和一些额外的信息时,出现未处理的异常) 。
有什么办法嵌入.PDB成汇编?
我想我的应用程序是可分配为一个.exe文件 ,但我希望能够获得源代码行数友好的错误报告(应用程序只发送电子邮件exception.ToString()
和一些额外的信息时,出现未处理的异常) 。
有什么办法嵌入.PDB成汇编?
使用小型转储,而不是“exception.ToString()”。 它会给你更多的信息,并且不需要.PDB与.exe文件分发。
有用的链接: 验尸调试您用小型转储和Visual Studio .NET应用程序
我已经使用了以下AssemblyResolve
处理程序,然后嵌入两个dll
和pdb
任何组件。 你可以设置它为运行第一件事就是在应用程序需要依赖任何事情之前。
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;
}
}
你可以写一个存根可执行文件,它包含嵌入的资源,无论是实际的可执行文件和PDB文件。 在开始STAUB可执行文件,它提取真正的可执行文件和PDB到一个临时目录并启动它。
就像一些安装人员或其他应用程序一样。
我不知道这是否是值得额外的努力,虽然。