C# 如何在.Net的最新版本中获取文件类型的IPreviewHandler

C# 如何在.Net的最新版本中获取文件类型的IPreviewHandler,c#,.net,comobject,ipreviewhandler,C#,.net,Comobject,Ipreviewhandler,最近在工作中,我收到一个项目,要求我获取特定文件类型的预览,并将其显示在预览窗格中(类似于windows文件资源管理器中的预览窗格)。在对如何实现这一目标进行了3到4天的广泛研究之后,我完全不知所措 起初我试着跟随这篇文章,但除了一些很长的随机错误代码外,我无法让AssocQueryString返回任何东西。在搜索其他解决方案之后,我在这里偶然发现了这篇文章,在完成了他的教程并下载了示例代码之后,我能够生成word文档的预览,但不能生成任何其他文件类型的预览。使这成为可能的代码就是这里的这些行

最近在工作中,我收到一个项目,要求我获取特定文件类型的预览,并将其显示在预览窗格中(类似于windows文件资源管理器中的预览窗格)。在对如何实现这一目标进行了3到4天的广泛研究之后,我完全不知所措

起初我试着跟随这篇文章,但除了一些很长的随机错误代码外,我无法让AssocQueryString返回任何东西。在搜索其他解决方案之后,我在这里偶然发现了这篇文章,在完成了他的教程并下载了示例代码之后,我能够生成word文档的预览,但不能生成任何其他文件类型的预览。使这成为可能的代码就是这里的这些行

var comType=Type.GetTypeFromCLSID(CurrentPreviewHandler,true);
_mCurrentPreviewHandler=Activator.CreateInstance(comType);
if(\u mCurrentPreviewHandler是IPreviewHandler处理程序)
{
//将预览处理程序绑定到控件的边界并预览内容
var r=ClientRectangle;
handler.SetWindow(句柄,参考r);
handler.DoPreview();
返回true;
}
在使用调试器之后,我发现word文档返回一个System.\uu ComObject,而我试图为其生成预览的文件类型返回用于创建ShellExtension的类的实例。所以我回到互联网上进行更多的研究,发现了这个代码项目的例子。这个项目实际上生成了我正在寻找的文件类型的预览!我非常兴奋,直到我注意到项目使用了与上面完全相同的代码来生成预览!我非常困惑,直到我注意到这两个项目的System.dll是不同的版本。一个是针对.NET3.5的,另一个是针对.NET4.6.1的,这很不幸,因为我们的项目使用.NET4.6.1

既然你已经掌握了最新的进度,我的问题是。在.NET4.6.1中是否有类似于在.NET3.5中的预览方式的文件预览?有人知道这两个版本之间发生了什么变化吗?或者也许有一种完全不同的方法可以做得更好?提前谢谢


另外,在.Net 3.5项目中使用调试器时,我注意到Type.GetTypeFromCLSID正在返回一个System.\u ComObject,这也是它在word文档中返回的内容。这与此有关吗?另外,虽然.Net 3.5确实生成了预览,但它会抛出以下异常System.Runtime.Serialization.SerializationException:“尝试反序列化空流。”我不知道这是否有用,但我想我会将其包括在内以防万一

经过大约一个半月的努力,我终于找到了解决办法。。。有点我发现C++ API函数仍然用于生成我的预览,所以我创建了一个C++ DLL来生成我的预览。我在事物的C#端创建了一个border元素,并将其子元素设置为从HwndHost继承的类,以便border获得一个窗口句柄。然后我将窗口句柄传递到C++的DLL中,让DLL负责其他的预览绘制工作。p> 我将是第一个承认这不是一个完美的解决方案,但它让预览工作到现在。我在微软的支持下提交了一份问题单,如果他们提出了比我更好的解决方案,我会在这里提供。此外,如果有人对这项工作有任何疑问,请留下评论,我将尝试对我所做的添加更详细的解释