Dot-Net

將 pdb 嵌入到程序集中

  • November 13, 2014

我希望我的應用程序可以作為單個 .exe 文件分發,但我希望能夠獲得帶有原始碼行號的漂亮錯誤報告(exception.ToString()當發生未處理的異常時,應用程序只需發送電子郵件和一些附加資訊)。

有沒有辦法將 .pdb 嵌入到程序集中?

使用 MiniDumps 而不是“exception.ToString()”。它將為您提供更多資訊,並且不需要將 .pdb 與 .exe 一起分發。

有用的連結:使用 Minidumps 和 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;
       }
   }

引用自:https://stackoverflow.com/questions/1518073