문제

내 응용 프로그램이 배포 가능하기를 원합니다 단일 .exe 파일 그러나 소스 코드 라인 번호로 멋진 오류 보고서를 얻을 수 있기를 원합니다 (응용 프로그램은 단순히 이메일을 보냅니다. exception.ToString() 처리되지 않은 예외가 발생할 때 일부 추가 정보).

.pdb를 어셈블리에 포함시키는 방법이 있습니까?

도움이 되었습니까?

해결책

"Exception.toString ()"대신 Minidumps를 사용하십시오. 더 많은 정보가 제공되며 .exe와 함께 .pdb를 배포 할 필요가 없습니다.

유용한 링크 : 미니 덤프 및 비주얼 스튜디오 .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를 임시 디렉토리로 추출하여 시작합니다.

일부 설치 업체 나 다른 응용 프로그램과 마찬가지로.

그래도 추가 노력의 가치가 있는지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top