我想我的应用程序是可分配作为的单.exe文件的,但是我希望能够获得源代码行数友好的错误报告(应用程序只发送电子邮件exception.ToString()和一些额外的当未处理的异常发生的信息)。

是否有任何方式嵌入.PDB成汇编

有帮助吗?

解决方案

使用小型转储,而不是 “exception.ToString()”。它会给你更多的信息,并且不需要.PDB与.exe文件分发。

相关链接:验尸调试您用小型转储和Visual Studio .NET <应用程序/一>

其他提示

我已经使用以下AssemblyResolve处理程序,然后嵌入任何组件都dllpdb。你可以设置它为运行第一件事就是在应用程序需要依赖任何事情之前。

    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到临时目录,并启动它。

就像一些安装或其他应用程序做。

我不知道是否值得额外的努力,虽然。

scroll top