最近,我们收到一些客户的需求,希望能在C#语言环境中预览我们软件的绘图格式文件。
我们之前提供了一些API可以操作文件数据,但是没有预览功能。最可行的方法,就是通过ExportImage的API导出一些图像文件,再到C#里面用图像控件显示出来。但是,这种做法非常低效,因为有不必要的文件操作,会影响显示速度。
通过参考我们以前实现过的一个预览控件,可以提供一些解决方案给我们的C#用户。
这个控件的能力是可以在Windows File Explorer中直接预览选中的文件。
例如:
而这个解决方案的例子,可以从下面这个大神的博客中找到。
https://www.brad-smith.info/blog/archives/183
最后,我们的解决方案是大致这样的:
不过,令人感到沮丧的是,这个大神的例子存在问题。
主要有两点:
1. 无法使用debug版的预览控件
2. 无法从C#环境里调试由C++写的控件代码
为了解决第一点,需要第二点的能力。而第二点对我来说,是一个陌生的技术问题。
一般来说,通过尝试在预览控件代码里加入DebugBreak(),我们期望能中断程序并进行调试。
但是,不幸的是,在这个例子的C#环境里,C++代码的DebugBreak并不起作用。哪怕我加入一个MessageBox()来强行中断程序,我在调用堆栈里看到的仍然是无法解读的信息。
失去了调试能力,就无法知道问题发生的原因,更无法找到解决问题的办法。
于是,我们开始查找如何在C#环境里调试C++代码?
结果,我们发现了这个。
https://stackoverflow.com/questions/4354411/debugging-native-code-when-called-from-managed
通过一个选项开关,我们打开了调试C++的能力。