某些标记扩展会引发编译错误.例如,如果找不到引用的类,则StaticExtension(x:Static)会引发编译错误.有谁知道这个的机制?是否已融入XAML编译器或自定义标记扩展可用的功能?
编辑:mfeingold下面建议我需要查看IVsErrorList接口,但我不能立即看到这将如何帮助某人白色标记扩展生成编译时错误.任何例子?
扩展BAML编译过程以记录其他错误
去年我遇到了同样的问题.我正在编写自己的扩展,我想在某些scenrios中编译错误,并发现只是抛出异常ProvideValue不起作用,因为ProvideValue在实际加载XAML并创建对象树之前不会调用它.
我做了一些实验,发现编译器错误消息x:Static是BAML编译器完成的优化的副产品.BAML格式实际上具有特定类型的特定成员的概念,因此当XAML包含时x:Static,编译器实际上将其替换为直接引用该成员而不是包含类型和方法名称的特殊记录.它通过明确地识别StaticExtension类来实现这一点.TypeExtension具有类似的优化.
我搜索了允许我在BAML编译期间调用自己的代码的钩子,但我没有找到任何代码.BAML编译大多只是直接音译成对应于XAML的二进制格式,只有一些特定的优化,但大多忽略了它所看到的内容.
我最终在构建过程中添加了一个额外的步骤,对我的代码Microsoft.WinFX.targets和其他内置目标文件进行建模.此步骤扫描XAML以查找我的标记扩展,检查参数,如果它们不正确则生成编译错误.这完全独立于BAML的翻译.当所有人都说完了,实施这项工作需要几天的额外工作,但我学到了很多东西.
关于创建自己的.targets文件的注意事项
如果您正在考虑添加自己的.targets文件,您应该知道,除非您将目标包含在本地计算机的SafeImports注册表项中,否则Visual Studio和Expression Blend都会抱怨任何包含.targets文件的项目.此密钥需要计算机上的管理员访问权限才能更新.这可能是也可能不是问题,具体取决于您的部署方案.(例如,机器范围的MSI安装会修复它,或者如果您只有几台开发机器,则可以手动设置密钥).在我的情况下,它没关系,因为我已经需要自定义.targets文件用于我在该项目中执行的其他一些操作.
从构建任务记录错误
在构建期间,您不需要IVsErrorList向Visual Studio添加错误(如果您这样做,则不会正确支持命令行构建,Expression Blend和其他工具).
您需要做的就是从构建任务中调用Log.LogErrror Log.LogWarning,如下所示:
public class CheckForErrorsInMyMarkupExtension : Task
{
... parameters here ...
public override Execute()
{
... code to load XAML and scan it for markup extension errors ...
... when you discover an error ...
Log.LogError("I saw an error");
}
}
Run Code Online (Sandbox Code Playgroud)