2016-07-18 16 views
1

我有一个需要从图像文件中提取某些元数据的ASP.NET MVC应用程序。我目前使用Windows API代码包要做到这一点,如下所示:当通过Windows API获取包含unicode字符的元数据时,应用程序崩溃

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

本地,在我的电脑,这工作得很好:它会包含文件的标题属性的字符串,符合市场预期。但是,当部署到Web服务器时,w3wp.exe在到达第二行代码时崩溃,如果它试图获取的属性包含像LINE SEPARATOR(U + 2028)或LATIN SMALL LETTER THORN(U + 00FE)这样的Unicode字符)。我无法捕捉异常,所以我无法确定问题是什么,更糟的是,我无法优雅地失败:IIS进程立即崩溃。在服务器上,这会弹出标准的Visual Studio刚刚在实时调试对话框,说明

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相关的东西,但我无法想象为什么在服务器上的资源管理器中查看文件属性显示这些Unicode字符就好了。

这是怎么回事?

回答

2

我已经设法追查问题和修复,所以我在这里离开这个后代:

的问题是在Windows API代码包的互操作调用到IShellItem2.GetProperty()。此方法具有类型为PropVariant的out方法,该方法在代码包的Core项目中定义为MS.WindowsAPICodePack.Internal.PropVariant。这种类型表示OLE结构PROPVARIANT。

PROPVARIANT具有一个与所述FieldOffsetAttribute装饰,指定偏移量为12这是不正确一个IntPtr字段_ptr2:它应该是16

有一个拉入请求(https://github.com/aybe/Windows-API-Code-Pack-1.1/pull/5)的代码组的GitHub的网页上的固定这个问题。令人遗憾的是,代码包显然被其唯一的贡献者放弃了,所以看起来并没有任何拉取请求被合并。我最终应用修补程序并将代码包打包为私人nuget服务器上的新NuGet包。

相关问题