2016-07-18 5 views
1

이미지 파일에서 특정 메타 데이터를 추출해야하는 ASP.NET MVC 응용 프로그램이 있습니다. 나는 현재 다음과 같이이 작업을 수행하기 위해 Windows API 코드 팩을 사용하고 있습니다 :Windows API 코드 팩을 통해 유니 코드 문자가 포함 된 메타 데이터를 가져 오는 경우 응용 프로그램이 충돌 함

로컬
var imageShellObject = ShellObject.FromParsingName(filePath); 
var title = imageShellObject.Properties.System.Title; 

는 내 PC에,이 잘 작동 : 그것은 예상대로 파일의 제목 속성을 포함하는 문자열을 가져옵니다. 그러나 웹 서버에 배포 된 경우 w3wp.exe는 두 번째 코드 줄에 도달하면 충돌하려고합니다. LINE SEPARATOR (U + 2028) 또는 LATIN SMALL LETTER THORN (U + 00FE)과 같은 유니 코드 문자가 포함 된 경우). 예외를 잡을 방법이 없으므로 문제가 무엇인지 판단 할 수 없으며 오류가 발생해도 정상적으로 실패 할 수는 없습니다. IIS 프로세스가 즉시 중단됩니다. 서버에서이 표준 비주얼 스튜디오

An unhandled win32 exception occurred in w3wp.exe [3708]. Just-In-Time debugging this exception failed with the following error: No installed debugger has Just-In-Time debugging enabled. In Visual Studio, Just-In-Time debugging can be enabled from Tools/Options/Debugging/Just-In-Time. Check the documentation index for 'Just-in-time debugging, errors' for more information.

는 윈도우 오류 로그 중 오류에 대한 세부 사항을 표시하지 않습니다 진술 적시에 디버거 대화 상자를 팝업, 그냥 응용 프로그램 오류의 수는 발생 표시 모듈 propsys.dll, combase.dll 및 KERNELBASE.DLL에 대한 w3wp.exe

이상한 점은 응용 프로그램을 로컬에서 실행하면 동일한 파일을 사용하여 올바르게 작동한다는 것입니다. 서버에 유니 코드 관련 내용이 누락되었다는 인상을 받았지만 서버의 탐색기에서 파일 속성을 살펴보면 유니 코드 문자가 잘 표시되므로 왜 상상할 수 없습니다.

여기 무슨 일 이니?

답변

2

내가 문제 및 수정을 추적 관리했습니다, 그래서 미래 세대를 위해 여기를 떠날거야 :

문제는 IShellItem2.GetProperty에 윈도우 API 코드 팩의 상호 운용성 호출에 있었다(). 이 메서드에는 코드 팩의 핵심 프로젝트에서 MS.WindowsAPICodePack.Internal.PropVariant로 정의되는 PropVariant 형식의 out 메서드가 있습니다. 이 유형은 OLE 구조체 PROPVARIANT를 나타냅니다.

PropVariant는이 올바르지 않습니다 (12)로 오프셋 지정하여 FieldOffsetAttribute 장식 것를 IntPtr 필드 _ptr2이있다 : 그것은 16

이 수정 코드 팩의 GitHub의 페이지에 끌어 오기 요청 (https://github.com/aybe/Windows-API-Code-Pack-1.1/pull/5) 거기에 있어야한다 이 문제. 안타깝게도 코드 팩은 유일한 기여자에 의해 포기 된 것이므로 끌어 오기 요청이 병합되는 것처럼 보이지 않습니다. 픽스를 적용하고 개인 누에 쯔 (Nuget) 서버에 새 NuGet 패키지로 코드 팩을 포장했습니다.