不幸的是, 最新的 Adobe 查看器(aka. ASV), 3.0 版本, 仅仅提供了 SVGWindow 接
口. 如果需要操作实际的 SVG DOM 本身, 你需要使用 C#的反射功能. Stefan
Goessner 在其站点上对此有详尽的介绍,并提供了代码. 顺便提一下这种方法能
够兼容最终的 3.0 版本. 实际上本文介绍的库也将使用这种方法. 同时, Jim
Longson 实现了一个令人印象深刻的例子(需要 Yahoo SVG 开发人员组的成员身
份下载), 该示例对我有很大帮助. 关于内置 SVG 控件的更多资料可以在 SVG
Wiki 中找到.
我曾经编写了相当多与 ASV 相关的 ECMAScript 代码, 并习惯使用 ECMAScript 提
供的 SVG DOM API. 因此对 C#中缺省不提供这些 API 感到很失望. 幸运的是, 之
前我在一个 IDL 解释器上花费过一些时间, 尽管这个解释器还没有完善, 但已经
足够用于生成有用的 SVG 库. 通过该解释器, 我生成了一系列封装类, 可以使 C#
开发人员在 SVG 控件中使用 SVG DOM API. 本文接下来讨论这些类是如何实现的,
以及在自己的 C#项目中如何使用这些类.
声明: 我刚刚开始使用 C#和.NET 开发. 因此对该库很可能有更好的实现方法. 如
果你发现了某些错误, 或者有些建议, 请马上与我联系以便对代码进行改进.
ASV3Sharp 的实现
本章讨论 ASV3Sharp 库的底层,读者会对如何实现 SVG DOM API 调用有一个更
好的了解. 这些知识对如何绕过 ASV3Sharp 调用很有帮助.
根据 Adobe 最新的支持文档中描述的, ASV 控件提供了 SVGWindow 接口. 该接口
对控件中显示的 SVG 文档提供了足够的控制方法. 同时, 你可以使用 postURL,
getURL 等方法. svgDocument 是 DOM 开发人员使用最多的接口之一, 但是, 如前
所述, 该接口并没有提供给开发人员. 幸运的是, 反射机制可以让我们调用其方
法, 前提是我们必须知道方法名称以及需要提供给方法的参数.
System.Type 类
如果仔细阅读了 Visual Studio .NET 文档, 会发现一个叫做 System.Type 的类.
通过该类可以在运行时调用方法, 取得或设置属性. (注意通过该类可以完成更多
的工作, 不过这里仅仅介绍我们感兴趣的部分) 以字符串的形式提供方法和属性
名, 并提供所需的参数, 这种机制被称为反射. 我们仅仅使用一个叫做
InvokeMember 方法, 就能够完成调用方法, 取得或设置属性的操作. 通过一
个 BindingFlags 类型的参数能够指定我们想要执行的哪一种操作.
调用方法
现在来看一下调用方法的例子. 我们假设 SVG 控件已经被创建, 初始化, 分配给
ASV3Control 并显示了一个 SVG 文档.
AxSVGACTIVEXLib.AxSVGCtl svgWindow = ASV3Control.getWindow();
object svgDocument = svgWindow.getDocument();
Type type = svgDocument.GetType();
object svgRoot = type.InvokeMember(
"getRootElement",
BindingFlags.InvokeMethod,