最近在工作中,我收到一个项目,要求我预览特定文件类型并将其显示在预览窗格中(类似于 Windows 文件资源管理器中的预览窗格)。在对如何实现这一目标进行了 3 或 4 天的广泛研究之后,我完全被难住了。
起初我尝试关注这篇文章如何获取文件扩展名的 IPreviewHandler?但除了一些非常长的随机错误代码之外,我永远无法让 AssocQueryString 返回任何内容。在寻找另一种解决方案后,我偶然发现了这篇文章https://www.brad-smith.info/blog/archives/183在按照他的教程并下载示例代码之后,我能够生成 Word 文档的预览,但是不适用于任何其他文件类型。使这成为可能的代码是这里的这些行
var comType = Type.GetTypeFromCLSID(CurrentPreviewHandler, true);
_mCurrentPreviewHandler = Activator.CreateInstance(comType);
if (_mCurrentPreviewHandler is IPreviewHandler handler)
{
// bind the preview handler to the control's bounds and preview the content
var r = ClientRectangle;
handler.SetWindow(Handle, ref r);
handler.DoPreview();
return true;
}
在使用调试器后,我发现 word 文档返回 System.__ComObject,而我试图为其生成预览的文件类型返回用于创建 ShellExtension 的类的实例。所以我回到互联网进行更多研究,发现了这个 CodeProject 示例https://www.codeproject.com/Articles/25465/Using-Vista-Preview-Handlers-in-a-WPF-Application。这个项目实际上为我正在寻找的文件类型生成了预览!我非常兴奋,直到我注意到该项目使用了与上面完全相同的代码生成预览!我非常困惑,直到我注意到两个项目的 System.dll 是不同的版本。一个有效的目标是 .Net 3.5,另一个目标是 .Net 4.6.1,这很不幸,因为我们的项目使用的是 .Net 4.6.1。
所以现在你已经跟上了速度,这是我的问题。无论如何,在 .Net 4.6.1 中是否可以像在 .Net 3.5 中一样获得文件的预览?有谁知道这两个版本之间有什么变化?或者也许有一种完全不同的方法可以更好地做到这一点?提前致谢!
PS 在 .Net 3.5 项目中使用调试器时,我注意到 Type.GetTypeFromCLSID 返回一个 System.__ComObject ,这也是它为 word 文档返回的内容。这有关系吗?此外,虽然 .Net 3.5 确实生成了预览,但它会引发此异常 System.Runtime.Serialization.SerializationException:“尝试反序列化空流。” 我不知道这是否有帮助,但我想我会包括它以防万一。