2012-10-03 1 views
1

Windows 8에서 기존 응용 프로그램을 테스트 할 때 매우 이상한 충돌이 발생합니다. 주 응용 프로그램은 Delphi XE (Win32)로 작성되었으며 COM interop을 사용하여 .NET 어셈블리를 호출합니다. 사용되는 현재 .Net 버전은 3.5입니다.Windows 8의 Double.TryParse에서 산발적 인 크래시를 디버깅하려면 어떻게해야합니까?

Windows 8을 새로 설치하면 응용 프로그램이 실행될 때 갑자기 정상적으로 실행되기 전에 응용 프로그램이 최대 10 회 충돌합니다. 일단 확인을 시작하면 계속 그렇게 할 것입니다. 오류 로그 또는 오류 메시지가 표시되지 않습니다. 응용 프로그램이 작동을 멈추거나 작동을 멈 춥니 다.

저는 실제와 가상의 4 가지 Win8 설치에서 동일한 결과를 얻었습니다.

일부 원격 디버깅을 할 수 있었고 숫자가 아닌 값을 구문 분석하려고 할 때 .Net 메서드 Double.TryParse으로 오류를 추적 할 수있었습니다.

Double.Parse Try/Catch 블록 내에서 작동하지 않습니다.

주 어셈블리는 Delphi Prism으로 작성되었지만 VS2010을 사용하여 C#으로 작성된 테스트 어셈블리로 오류를 재현 할 수있었습니다.

.Net 4가 제대로 작동하는 것 같지만 오라클에 대한 지원이 누락되어 현재 업그레이드 할 수 없습니다.

이 프로그램은 또한 2012 년

어떤 힌트이나 제안 정말 감사하겠습니다 윈도우 서버에 이전 버전의 Windows에서 확인을 작동합니다.

추가 : C#/관리 코드로 작성된 다른 테스트 응용 프로그램에서 호출 할 때 테스트 어셈블리가 제대로 작동한다는 점을 잊어 버렸습니다. Delphi (Win32), .NET 3.5, COM InterOp 및 Windows 8의 조합 만 충돌을 일으 킵니다.

왜 갑자기 응용 프로그램이 갑자기 작동하기 시작했는지에 대해 매우 당혹 스럽습니다. 최대 10 번 충돌 한 것입니다.

+1

Win8 시스템의 문화 설정과 관련이 있습니까? double.TryParse ("24.45", NumberStyles.Any, CultureInfo.GetCultureInfo ("en-US"), 출력 출력)과 같은 것을 시도해보십시오. – Amitd

+0

Nope. 나는 그것을 시도했지만 응용 프로그램은 여전히 ​​충돌합니다. – Cactus99

+0

C# dll을 다른 C# 프로젝트의 com 참조로 추가하면 (델파이를 사용하지 마십시오)? –

답변

0

Microsoft는이 문제를 스스로 해결 한 것으로 보입니다. Windows Update에서 제공되는 Windows 8에 대한 최신 수정 프로그램을 설치하면 문제가 해결됩니다.

1

코드를 작성하지 않아도 문제를 해결하기가 매우 어려울 수 있지만 몇 가지 권장 사항을 제시 할 수 있습니다.

실제로 .Net 3.5 런타임을 설치 했습니까? 실제 .Net 3.5 런타임을 실행하고 .NET 4.0 (Windows 8이 사전 설치되어 제공됨)에서 "에뮬레이션"하는 것과는 약간의 차이가 있습니다.

그런 다음 어셈블리 매니페스트를 작성/수정하여 특정 런타임 버전에서 응용 프로그램을 실행하도록 시도 할 수 있습니다.

Force an application to run under specific .NET runtime version?

마지막으로, 당신은 문제가 64 비트와가 있는지 32 비트 공간에 응용 프로그램을 강제로 시도 할 수 있습니다. 불행하게도 이것은 프로세스에 의해 제어되며 DLL에 의해 변경 될 수 없습니다. .NET 실행 파일이 프로젝트 속성이나 컴파일러 플래그를 통해이를 지정할 수 있습니다 닷넷 코드는 델파이 .NET 호스트에서 실행되는 경우이 이후 http://msdn.microsoft.com/en-us/library/zekwfyz4(VS.80).aspx

만 일어나고, 나는 있는지보고 싶은데 .NET AppDomain을 통해 Delphi에서 컨트롤을 만들 수 있습니다.델파이 개발자가 아니기 때문에 여기서 당신을 도울 수는 없지만 코드가 AppDomain으로로드되는 방식을보다 잘 제어 할 수있는 JCL이라는 라이브러리가있는 것처럼 보입니다. 당신이 추적 할 수있는 경우

Hosting the .NET runtime in a Delphi Program

, 나는 그들이 잠재적를 해결할 수 있도록 (그것이 해결하기 위해 그들의 통제에있어 가정) Microsoft 지원하여 연구 결과를 공유하는 것이 좋습니다.

+0

Windows 8 컴퓨터를 검사했는데 .NET 3.5가 제대로 설치되어있는 것으로 보입니다. 적절한 Microsoft.Net 폴더와 레지스트리 키가 모두 시스템에 있습니다. 우리는이 문제에 대해 제 시간에 다가 가고 있습니다. 어셈블리를 .Net 4로 업그레이드하려고 시도 할 것입니다. 어셈블리를 사용하는 다른 웹 응용 프로그램이 있으므로 제품 차별화를 의미합니다. 우리는이 순간에도 업데이트 할 수있는 위치에 있지 않으므로 그렇게 할 수는 없습니다. – Cactus99

0

델파이는 .NET에서 허용하지 않는 CPU 비트 수를 변경합니다. 그것은 어떤 종류의 오버 플로우에 대한 예외를 던집니다. 델파이 측에서 다음과 같이 시도하십시오.

var lSave: Word; 


lSave := Get8087CW; 

Set8087CW($037f); 

<YOURCALLTO.NET> 

Set8087CW(lSave);