更新迁移到 .NET Framework 4.5 的 Excel 和 Word 项目

如果你有使用下列任何功能的 Excel 或 Word 项目,则必须在目标框架更改为 .NET Framework 4 或更高版本时修改代码:

从 Excel 项目中删除 ExcelLocale1033 属性

Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute已从 Visual Studio 2010 Tools for Office 运行时的部分中删除,该部分用于面向 .NET Framework 4 或更高版本的解决方案。 .NET Framework 4 及更高版本中的公共语言运行时 (CLR)始终将区域设置 ID 1033 传递给 Excel 对象模型,并且不能再使用此属性禁用此行为。 有关详细信息,请参阅 Excel 解决方案的全球化和本地化

删除 ExcelLocale1033Attribute

  1. 在 Visual Studio 中打开项目后,打开 解决方案资源管理器

  2. “属性 ”节点(for C#)或 “我的项目 ”节点(对于 Visual Basic)下,双击 AssemblyInfo 代码文件以在代码编辑器中打开该文件。

    注释

    在 Visual Basic 项目中,必须单击解决方案资源管理器中的“显示所有文件”按钮才能查看 AssemblyInfo 代码文件。

  3. 找到Microsoft.Office.Tools.Excel.ExcelLocale1033Attribute,并将其从文件中删除或注释掉。

    [assembly: ExcelLocale1033Proxy(true)]
    

删除对 ExcelLocal1033Proxy 类的引用

使用 Microsoft Visual Studio 2005 Tools for the Microsoft Office System 创建的项目通过使用Application类实例化 Excel Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy 对象。 该类已从 Visual Studio 2010 Tools for Office 运行时中与 .NET Framework 4 或更高版本解决方案相关的部分中删除。 因此,必须删除或注释掉引用此类的代码行。

删除对 ExcelLocal1033Proxy 类的引用

  1. 在 Visual Studio 中打开项目,然后打开 解决方案资源管理器

  2. 解决方案资源管理器中,打开 ThisAddin.cs (适用于 C#)或 ThisAddin.vb 的快捷菜单(对于 Visual Basic),然后选择 “查看代码”。

  3. 在代码编辑器的 VSTO generated code 区域中,删除或注释掉以下代码行。

    this.Application = (Excel.Application)Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Wrap(typeof(Excel.Application), this.Application);
    
    

更新使用 GetVstoObject 和 HasVstoObject 方法的代码

在面向 .NET Framework 3.5 的项目中,GetVstoObject或者HasVstoObject方法可以作为以下本机对象之一的扩展方法:DocumentWorkbookWorksheetListObject。 调用这些方法时,无需传递参数。 下面的代码示例演示如何在面向 .NET Framework 3.5 的 Word VSTO 外接程序中使用 GetVstoObject 方法。

Microsoft.Office.Tools.Word.Document vstoDocument =
    Globals.ThisAddIn.Application.ActiveDocument.GetVstoObject();

在面向 .NET Framework 4 或更高版本的项目中,必须修改代码才能通过以下方式之一访问这些方法:

  • 你仍然可以以扩展方法的形式访问这些方法DocumentWorkbookWorksheetListObject对象。 但是,现在必须将由 Globals.Factory 属性返回的对象传递给这些方法。

    Microsoft.Office.Tools.Word.Document vstoDocument =
        Globals.ThisAddIn.Application.ActiveDocument.GetVstoObject(Globals.Factory);
    
  • 你还可以访问由 Globals.Factory 属性返回的对象上的这些方法。 当以这种方式访问这些方法时,必须传递您想要扩展的本机对象给该方法。

    Microsoft.Office.Tools.Word.Document vstoDocument =
        Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument);
    

    有关详细信息,请参阅 运行时在 VSTO 外接程序中扩展 Word 文档和 Excel 工作簿

更新在文档级项目中使用生成的类实例的代码

在面向 .NET Framework 3.5 的文档级项目中,项目中生成的类派生自 Visual Studio Tools for Office 运行时中的以下类:

  • ThisDocument: Document

  • ThisWorkbook: Workbook

  • Sheet nWorksheet

  • Chart nChartSheet

    在面向 .NET Framework 4 或更高版本的项目中,上面列出的 Visual Studio Tools for Office 运行时中的类型是接口,而不是类。 面向 .NET Framework 4 或更高版本的项目中生成的类派生自 Visual Studio Tools for Office 运行时中的以下新类:

  • ThisDocument: DocumentBase

  • ThisWorkbook: WorkbookBase

  • Sheet nWorksheetBase

  • Chart nChartSheetBase

    如果项目中的代码引用其中一个生成的类的实例作为派生自的基类,则必须修改代码。

    例如,在面向 .NET Framework 3.5 的 Excel 工作簿项目中,你可能有一个帮助程序方法,用于对项目中生成的 Sheetn 类的实例执行一些工作。

private void DoSomethingToSheet(Microsoft.Office.Tools.Excel.Worksheet worksheet)
{
    // Do something to the worksheet object.
}

如果将项目重定向到 .NET Framework 4 或更高版本,则必须对代码进行以下更改之一:

  • 修改任何调用 DoSomethingToSheet 方法的代码,以便在您的项目中传递 WorksheetBase 对象的 Base 属性。 此属性返回一个 Worksheet 对象。

    DoSomethingToSheet(Globals.Sheet1.Base);
    
  • 请修改DoSomethingToSheet方法的参数,以便其预期一个WorksheetBase对象。

    private void DoSomethingToSheet (Microsoft.Office.Tools.Excel.WorksheetBase worksheet)
    {
        // Do something to the worksheet object.
    }
    

更新在文档上使用 Windows 窗体控件的代码

必须在任何代码文件的顶部添加用于对Microsoft.Office.Tools.ExcelMicrosoft.Office.Tools.Word命名空间的using (C#)或Imports (Visual Basic)语句,以便使用 Controls 属性以编程方式将 Windows 窗体控件添加到文档或工作表中。

在面向 .NET Framework 3.5 的项目中,添加 Windows 窗体控件的方法(例如 AddButton 方法)在 ControlCollectionControlCollection 类中定义。

在面向 .NET Framework 4 或更高版本的项目中,这些方法是可在 Controls 属性上使用的扩展方法。 若要使用这些扩展方法,包含使用这些方法的代码文件必须有一个using 语句或一个Imports 语句用于Microsoft.Office.Tools.ExcelMicrosoft.Office.Tools.Word命名空间。 此语句在面向 .NET Framework 4 或更高版本的新项目中自动生成。 但是,此语句不会在面向 .NET Framework 3.5 的项目中自动添加,因此在重定目标项目时必须添加它。

有关详细信息,请参阅 运行时向 Office 文档添加控件

更新处理 Word 内容控件事件的代码

在面向 .NET Framework 3.5 的项目中,Word 内容控件的事件由泛型 EventHandler<TEventArgs> 委托处理。 在面向 .NET Framework 4 或更高版本的项目中,这些事件由其他委托处理。

下表列出了面向 .NET Framework 4 或更高版本的项目中的 Word 内容控件事件和与其关联的委托。

事件 / 活动 委托在 .NET Framework 4 及更高版本中使用
Added ContentControlAddedEventHandler
ContentUpdating ContentControlContentUpdatingEventHandler
Deleting ContentControlDeletingEventHandler
Entering ContentControlEnteringEventHandler
Exiting ContentControlExitingEventHandler
StoreUpdating ContentControlStoreUpdatingEventHandler

更新使用 OLEObject 和 OLEControl 类的代码

在面向 .NET Framework 3.5 的项目中,可以使用Microsoft.Office.Tools.Excel.OLEObject类和Microsoft.Office.Tools.Word.OLEControl类将自定义控件(例如 Windows 窗体用户控件)添加到文档或工作表中。

在面向 .NET Framework 4 或更高版本的项目中,这些类已被ControlSiteControlSite接口替代。 必须将引用 Microsoft.Office.Tools.Excel.OLEObjectMicrosoft.Office.Tools.Word.OLEControl 的代码修改为引用 ControlSiteControlSite。 除了新名称之外,这些控件在面向 .NET Framework 3.5 的项目中,其行为方式与之前相同。

有关详细信息,请参阅 运行时向 Office 文档添加控件

更新使用 Controls.Item(Object) 属性的代码

在面向 .NET Framework 3.5 的项目中,可以使用 Microsoft.Office.Tools.Word.Document.Controls 或集合的 Item(对象)属性来确定文档或 Microsoft.Office.Tools.Excel.Worksheet.Controls 工作表是否具有指定的控件。

在面向 .NET Framework 4 或更高版本的项目中,Item(Object) 属性已从这些集合中删除。 若要确定文档或工作表是否包含指定的控件,请改用集合ControlsControls Contains(System.Object) 方法。

有关文档和工作表的控件集合的详细信息,请参阅 在运行时向 Office 文档添加控件

更新使用从 CollectionBase 派生的集合的代码

在面向 .NET Framework 3.5 的项目中,Visual Studio Tools for Office 运行时中的多个集合类型派生自 CollectionBase 类,例如 Microsoft.Office.Tools.SmartTagCollectionMicrosoft.Office.Tools.Excel.ControlCollectionMicrosoft.Office.Tools.Word.ControlCollection

在面向 .NET Framework 4 或更高版本的项目中,这些集合类型现在是不派生自 CollectionBase的接口。 某些成员不再可用于这些集合类型,例如 CapacityListInnerList