演练:嵌入 Microsoft Office 程序集中的类型信息(C# 和 Visual Basic)

如果您在引用 COM 对象的应用程序中嵌入类型信息,则可以不需要主互操作程序集 (PIA)。此外,利用嵌入的类型信息可实现应用程序的版本中立性。即,可以将程序编写为使用多个 COM 库版本中的多个类型,而不是每个版本都需要一个特定的 PIA。对于使用 Microsoft Office 库中对象的应用程序,这是一种常用方案。嵌入类型信息后,程序的同一个生成可以使用不同计算机上的不同 Microsoft Office 版本,而无需为 Microsoft Office 的每个版本重新部署该程序或 PIA。

在本演练中,您将执行以下任务:

  • 创建在多个 Microsoft Office 版本环境下工作的应用程序.

  • 将应用程序发布到安装有另一个 Microsoft Office 版本的计算机.

说明说明

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

系统必备

本演练需要如下内容:

  • 安装有 Visual Studio 和 Microsoft Excel 的计算机。

  • .NET framework 4 和 Excel 的不同版本。安装的第二台计算机上。

创建在多个 Microsoft Office 版本环境下工作的应用程序

  1. 在安装有 Excel 的计算机上,启动 Visual Studio。

  2. 在**“文件”菜单上,选择“新建”“项目”**。

  3. 在**“新建项目”对话框的“项目类型”窗格中,确保选中“Windows”。在“模板”窗格中,选择“控制台应用程序”**。在 名称 框中,输入 CreateExcelWorkbook,然后选择 确定 按钮。至此新项目创建完毕。

  4. 如果使用 Visual Basic,打开 CreateExcelWorkbook 项目的快捷菜单中选择 属性。选择 引用 选项。选择**“添加”**按钮。如果在 解决方案资源管理器使用 Visual C#,在中,打开 引用 文件夹的快捷菜单中选择 添加引用

  5. .NET 选项,请选择最新版本的 Microsoft.Office.Interop.Excel。例如,“Microsoft.Office.Interop.Excel 14.0.0.0”。选择**“确定”**按钮。

  6. 在 CreateExcelWorkbook 项目的引用列表中,选择上一步添加的 Microsoft.Office.Interop.Excel 引用。在**“属性”**窗口中,确保 Embed Interop Types 属性已设置为 True。

    说明说明

    由于嵌入的互操作类型信息,本演练中创建的应用程序将以不同的 Microsoft Office 版本运行。如果 Embed Interop Types 属性设置为 False,则必须为应用程序以后运行时使用的每个 Microsoft Office 版本包括一个 PIA。

  7. 如果使用 Visual Basic,打开 Module1.vb 文件。如果使用 Visual C#,打开 Program.cs 文件。用下面的代码替换文件中的代码。

    Imports Excel = Microsoft.Office.Interop.Excel
    
    Module Module1
    
        Sub Main()
            Dim values = {4, 6, 18, 2, 1, 76, 0, 3, 11}
    
            CreateWorkbook(values, "C:\SampleFolder\SampleWorkbook.xls")
        End Sub
    
        Sub CreateWorkbook(ByVal values As Integer(), ByVal filePath As String)
            Dim excelApp As Excel.Application = Nothing
            Dim wkbk As Excel.Workbook
            Dim sheet As Excel.Worksheet
    
            Try
                ' Start Excel and create a workbook and worksheet.
                excelApp = New Excel.Application
                wkbk = excelApp.Workbooks.Add()
                sheet = CType(wkbk.Sheets.Add(), Excel.Worksheet)
                sheet.Name = "Sample Worksheet"
    
                ' Write a column of values.
                ' In the For loop, both the row index and array index start at 1.
                ' Therefore the value of 4 at array index 0 is not included.
                For i = 1 To values.Length - 1
                    sheet.Cells(i, 1) = values(i)
                Next
    
                ' Suppress any alerts and save the file. Create the directory 
                ' if it does not exist. Overwrite the file if it exists.
                excelApp.DisplayAlerts = False
                Dim folderPath = My.Computer.FileSystem.GetParentPath(filePath)
                If Not My.Computer.FileSystem.DirectoryExists(folderPath) Then
                    My.Computer.FileSystem.CreateDirectory(folderPath)
                End If
                wkbk.SaveAs(filePath)
        Catch
    
            Finally
                sheet = Nothing
                wkbk = Nothing
    
                ' Close Excel.
                excelApp.Quit()
                excelApp = Nothing
            End Try
    
        End Sub
    End Module
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using Excel = Microsoft.Office.Interop.Excel;
    
    namespace CreateExcelWorkbook
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] values = {4, 6, 18, 2, 1, 76, 0, 3, 11};
    
                CreateWorkbook(values, @"C:\SampleFolder\SampleWorkbook.xls");
            }
    
            static void CreateWorkbook(int[] values, string filePath)
            {
                Excel.Application excelApp = null;
                Excel.Workbook wkbk;
                Excel.Worksheet sheet;
    
                try
                {
                        // Start Excel and create a workbook and worksheet.
                        excelApp = new Excel.Application();
                        wkbk = excelApp.Workbooks.Add();
                        sheet = wkbk.Sheets.Add() as Excel.Worksheet;
                        sheet.Name = "Sample Worksheet";
    
                        // Write a column of values.
                        // In the For loop, both the row index and array index start at 1.
                        // Therefore the value of 4 at array index 0 is not included.
                        for (int i = 1; i < values.Length; i++)
                        {
                            sheet.Cells[i, 1] = values[i];
                        }
    
                        // Suppress any alerts and save the file. Create the directory 
                        // if it does not exist. Overwrite the file if it exists.
                        excelApp.DisplayAlerts = false;
                        string folderPath = Path.GetDirectoryName(filePath);
                        if (!Directory.Exists(folderPath))
                        {
                            Directory.CreateDirectory(folderPath);
                        }
                        wkbk.SaveAs(filePath);
                }
                catch
                {
                }
                finally
                {
                    sheet = null;
                    wkbk = null;
    
                    // Close Excel.
                    excelApp.Quit();
                    excelApp = null;
                }
            }
        }
    }
    
  8. 保存项目。

  9. 按 Ctrl+F5 生成和运行项目。确认在代码示例中指定的位置处,已创建了 Excel 工作簿:C:\SampleFolder\SampleWorkbook.xls。

将应用程序发布到安装有另一个 Microsoft Office 版本的计算机

  1. 在 Visual Studio 中,打开此演练创建的项目。

  2. 生成 菜单中,选择 发布 CreateExcelWorkbook。按照发布向导的步骤进行操作,创建应用程序的可安装版本。有关更多信息,请参见发布向导(Visual Studio 中的 Office 开发)

  3. 安装应用程序在 .NET framework 4 和 Excel 的不同版本。安装的计算机。

  4. 安装完成后,运行安装的程序。

  5. 确认在代码示例中指定的位置处,已创建了 Excel 工作簿:C:\SampleFolder\SampleWorkbook.xls。

请参见

任务

演练:嵌入托管程序集中的类型(C# 和 Visual Basic)

参考

/link (Visual Basic)

/link(C# 编译器选项)