두 시스템의 동일한 소스 코드로 인해 실행 가능한 동작이 달라집니다.

StackOverflow https://stackoverflow.com/questions/86959

문제

시나리오는 다음과 같습니다.

SVN에 저장된 C# Windows 애플리케이션 프로젝트는 실행 파일을 만드는 데 사용됩니다.일반적으로 빌드 서버는 빌드 프로세스를 처리하고 테스트에 사용되는 정기적인 간격으로 빌드를 생성합니다.이 특별한 경우에는 특정 빌드를 수정하고 실행 파일을 생성하라는 요청을 받았습니다.

빌드 서버가 프로젝트 파일을 수정하는지 완전히 확신할 수는 없지만 실행 파일을 컴파일하는 데 사용된 소스 코드의 SVN에 태그를 생성한다는 것은 알고 있습니다.해당 태그를 사용하여 개발 컴퓨터인 두 번째 컴퓨터에서 코드를 체크아웃했습니다.그런 다음 개발 컴퓨터에서 소스를 컴파일했습니다.

실행 시 개발 시스템에서 컴파일된 애플리케이션은 빌드 서버에서 컴파일된 애플리케이션과 정확히 동일하게 작동하지 않습니다.예를 들어 테스트 시스템에서는 DateTime Parse 실행이 애플리케이션에 의해 감지됩니다.그러나 빌드 시스템의 실행 파일은 예외를 발생시키지 않습니다.개발 컴퓨터에서 실행 파일을 실행하면 예외가 발생하지 않습니다.

요약하면 두 컴퓨터는 이론적으로 동일한 소스 코드와 프로젝트를 사용하고 있습니다.
개발 컴퓨터의 실행 파일은 개발 컴퓨터에서만 작동합니다.빌드 시스템의 실행 파일은 개발 시스템을 포함한 모든 시스템에서 작동합니다.

컴퓨터의 지역 설정 또는 시간대가 컴파일된 실행 파일에 저장되어 있습니까?이 동작의 원인이 무엇인지 또는 실행 파일을 확인하여 가능한 차이점을 찾아 수정하는 방법에 대해 알고 계시나요?

불행하게도 테스트 머신에 디버거를 연결할 수는 없습니다.최대한 빨리 그렇게 할게요.

도움이 되었습니까?

해결책

앱이 실행 중인 컴퓨터의 지역 설정을 사용하는데, 이것이 귀하의 문제인 것 같습니다.System.Threading.Thread.CurrentThread.CurrentCulture 및 System.Threading.Thread.CurrentThread.CurrentUICulture를 특정 값으로 설정하여 스레드가 특정 문화권을 사용하도록 강제할 수 있습니다.

다른 팁

두 컴퓨터에 빌드 프로세스의 일부가 아닌 기본 dll의 서로 다른 버전이 있을 수 있습니다.내부 서버 팜 전체에 서비스를 배포할 때 이런 일이 발생하는 것을 보았습니다.

디버거를 사용하여 빌드 머신에서 프로그램을 실행할 수 있습니까?

그렇다면 문제를 디버그하십시오. 추측할 필요 없어.

개발 컴퓨터의 디버거가 예외를 포착하도록 하고 빌드 컴퓨터의 동일한 위치에 중단점을 설정합니다.둘 사이의 차이점을 확인하세요.

XP에서 다른 "지역 및 언어 옵션"이 이런 종류의 동작을 일으키는 것을 보았습니다.두 컴퓨터 모두에서 일치합니까?시작 | 설정 | 제어판 | 국가 및 언어 옵션...

몇 가지 질문이 있습니다. 두 컴퓨터 모두 동일한 지역 설정을 갖고 있으며 오류 로그는 어디에 있습니까?;-) 예외가 처리되고 디스크, 이벤트 로그에 기록되기를 바랍니다..이런 문제를 해결하는 데 도움이 되는 것.

구문 분석되는 날짜는 어디에서 왔습니까?그것이 귀하의 DB에 있다면 아마도 잘못된 데이터도 있을 것입니다.

비슷한 문제가 한 번 있었습니다(C++ 제외). 컴파일된 실행 파일의 크기를 비교했을 때 크기가 많이 달랐습니다.안타깝게도 며칠 간의 검색 끝에 제가 찾은 가장 좋은 해결책은 VS05를 제거하고 다시 설치하는 것이었습니다.

어쨌든 C# 코드에 빌드 서버를 사용하는 이유는 무엇입니까?

C#을 사용할 때 빌드 시간은 거의 눈에 띄지 않았습니다(2초 미만).앱이 정말 그렇게 큰가요?

빌드 시스템은 아마도 릴리스 버전을 만들고, 개발 PC의 수동 빌드는 디버그 버전을 만들 것입니다.디버그 버전에는 더 많은 오류 검사가 있습니다.릴리스 버전을 수동으로 빌드할 수 있는지 확인하고 여전히 차이점이 있는지 확인하세요.

모든 컴퓨터가 서로 다른 컴퓨터에서 동일한 프로그램을 빌드하는 경우 동일한 소스 코드는 거의 없습니다.항상 프로그램이 다르다고 가정해야 하며, 동일할 것이라고 기대하지 마십시오.좋은 패키지 관리자와 정기적 또는 무작위 업데이트가 있는 Linux와 같은 환경에서는 동일한 소스 코드가 동일한 컴퓨터에서 동일한 프로그램을 빌드할 것이라고 결코 기대하지 마십시오.언어가 높을수록 더 나빠집니다.디버거용 프로그램을 구축하는 것은 릴리스용으로 구축하는 것과 크게 다릅니다.디버거가 없더라도 디버거 버전은 릴리스 빌드로 이동할 때까지 찾을 수 없는 버그를 숨깁니다.디버거 환경에 너무 많이 의존하는 경우 기본적으로 프로그램을 두 번 디버깅하게 됩니다.

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