2016-07-18 9 views
1

У меня есть приложение ASP.NET MVC, которое должно извлекать определенные метаданные из файлов изображений. Я в настоящее время с помощью Windows API Code Pack, чтобы сделать это следующим образом:Сбой приложения при получении метаданных, содержащих символ Юникода, с помощью пакета кода Windows API

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

Локально, на моем компьютере, это работает отлично: он получает строку, содержащую свойство название файла, как и ожидалось. Однако при развертывании на веб-сервере w3wp.exe падает, когда достигает второй строки кода, если свойство, которое он пытается получить, содержит символ Юникода, такой как LINE SEPARATOR (U + 2028) или LATIN SMALL LETTER THORN (U + 00FE). У меня нет возможности поймать исключение, поэтому я не могу определить, в чем проблема, и хуже того, я не могу терпеть неудачу: процесс IIS просто сбой немедленно. На сервере, это всплывает стандартный Visual Studio Just-In-Time Debugger диалогового о том,

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.

Ошибка Вход в Windows не показывает никаких подробностей об ошибке либо, он просто отображает количество ошибок приложений происходит в w3wp.exe для модулей propsys.dll, combase.dll и KERNELBASE.DLL.

Странно, что если я запустил приложение локально, он отлично работает с использованием того же файла. У меня создается впечатление, что на сервере отсутствуют некоторые связанные с Unicode вещи, но я не могу себе представить, почему, поскольку просмотр свойств файла в проводнике на сервере отображает эти символы в Юникоде, просто отлично.

Что здесь происходит?

ответ

2

мне удалось отследить проблему и исправить, поэтому я оставляю это здесь для будущих поколений:

Проблема была в призыве-взаимодействия Windows API Code Pack для IShellItem2.GetProperty(). Этот метод имеет метод out типа PropVariant, который определяется как MS.WindowsAPICodePack.Internal.PropVariant в основном проекте кода пакета. Этот тип представляет собой OLE struct PROPVARIANT.

PropVariant имеет поле _ptr2 IntPtr, который украшенную FieldOffsetAttribute, указав смещение в 12. Это неверно: оно должно быть 16.

Там в Прицепные Request (https://github.com/aybe/Windows-API-Code-Pack-1.1/pull/5) на GitHub странице Code Pack, которая фиксирует Эта проблема. К сожалению, пакет кода, по-видимому, оставлен единственным его вкладчиком, поэтому он не похож на то, что любые запросы на загрузку объединяются. Я закончил тем, что применил исправление и упаковал пакет кода в виде нового пакета NuGet на частном сервере nuget.