我在VSTO项目中遇到一个奇怪的错误,其中XAML文件在不相关的代码中导致生成错误。
以下是我做的
-
创建一个新的Excel 2010加载项项目(此处命名为TestAddIn)
-
修改
ThisAddIn_Startup
以读取private void ThisAddIn_Startup(object sender, System.EventArgs e) { Worksheet w = Globals.ThisAddIn.Application.Workbooks[1].Sheets[1]; w.Rows[1].Font.Bold = true; }
-
生成项目。构建应该会成功。
-
将WPF用户控件作为新项添加到项目中。您还需要添加
System.Xaml
作为项目参考。 -
重新生成项目。构建应该会成功。
-
修改UserControl1.xaml以读取
<UserControl x:Class="TestAddIn.UserControl1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Test="clr-namespace:TestAddIn" <!-- Add this line --> > <Grid> </Grid> </UserControl>
-
生成项目。构建失败,并显示错误消息
"object"不包含"Font"的定义,也找不到接受"object"类型的第一个参数的扩展方法"Font"(是否缺少using指令或程序集引用?)
在UserControl1.xaml中删除或添加命名空间行将导致生成成功或失败。
我真的对此感到困惑,因为WPF文件与外接程序文件没有直接关系。我想一定有关联问题吧?
我意识到我可以通过执行显式强制转换(((Range)w.Rows[1]).Font.Bold = true
)来解决这个问题。但我真的不想到处都这样。
如何修复此问题,以便在我的VSTO项目中有一个WPF文件?
我找到了一种方法,可以让VS2012的用户使用它。
- 转到"解决方案资源管理器"->"引用"文件夹,然后选择对"Microsoft.Office.Interop.Excel"的引用
- 在其属性中,将"嵌入互操作类型"设置为False并进行编译。错误应该仍然会出现。现在再次将其设置回True并进行编译。瞧
此错误已在VS2013(更新3)中修复。
尝试在xmlns声明的末尾添加;assembly=
。像这样:
xmlns:Test="clr-namespace:TestAddIn;assembly="
我也遇到了这个问题,不知道根本原因是什么。
但是,如果命名空间是在不同于VSTO的程序集中定义的,那么我可以将命名空间添加到XAML文件中。
因此,每次都会出现奇怪的铸造错误:
xmlns:helper="clr-namespace:MyVstoProject.Utility"
但这很好:
xmlns:helper="clr-namespace:ReferencedProject.Utility;assembly=SomeNonVstoAssembly"