早期绑定
采用早期绑定时Visual C# 使用有关所涉及的 Office 应用程序的可用类型信息直接绑定到它需要使用的方法或属性编译器可以执行类型和语法检查以确保传递到方法或属性的参数的数量和类型正确无误并且返回的值是所期望的类型 由于早期绑定在运行时调用属性或方法所需的工作量较小因此有时速度较快然而虽然早期绑定可能速度较快但与晚期绑定之间的性能差异通常不大
早期绑定确实有这样一个小缺点可能会带来版本兼容性问题例如假定诸如 Microsoft Excel 之类的自动化服务器引入了 Excel 中没有的新方法或属性或者更改了现有的属性或方法这些更改可能会改变对象的二进制布局并导致使用 Excel 类型信息实现 Excel 自动化的 Visual C# 应用程序出现问题为了避免早期绑定发生这样的问题通常建议您在开发和测试自动化客户端时使用您希望支持的最低版本的 Office 应用程序的类型信息
下列步骤说明了如何创建使用早期绑定的自动化客户端请注意正如这些步骤所说明的那样早期绑定要求您引用自动化客户端的类型库
创建使用早期绑定的自动化客户端
启动 Microsoft Visual Studio NET在文件菜单上单击新建然后单击项目从 Visual C# 项目类型中选择 Windows 应用程序默认情况下会创建 Form
添加对 Microsoft Excel 对象库的引用为此请按照下列步骤操作
在项目菜单上单击添加引用
在 COM 选项卡上找到 Microsoft Excel 对象库并单击选择
注意Office 包含主 Interop 程序集 (PIA)Office XP 不包含 PIA但您可以下载 PIA 有关 Office XP PIA 的其他信息请单击下面的文章编号以查看 Microsoft 知识库中相应的文章
INFOMicrosoft Office XP PIA 可供下载
在添加引用对话框中单击确定以接受您的选择如果系统提示您为选定的库生成包装请单击是
在视图菜单上选择工具箱以显示工具箱然后向 Form 添加一个按钮
双击 Button将出现该窗体的代码窗口
在代码窗口中将以下代码private void button_Click(object sender SystemEventArgs e)
{
}
替换为 private void button_Click(object sender SystemEventArgs e)
{
ExcelApplication objApp;
Excel_Workbook objBook;
ExcelWorkbooks objBooks;
ExcelSheets objSheets;
Excel_Worksheet objSheet;
ExcelRange range;
try
{
// Instantiate Excel and start a new workbook
objApp = new ExcelApplication();
objBooks = objAppWorkbooks;
objBook = objBooksAdd( MissingValue );
objSheets = objBookWorksheets;
objSheet = (Excel_Worksheet)objSheetsget_Item();
range = objSheetget_Range(A MissingValue);
rangeset_Value(MissingValue Hello World! ); //Return control of Excel to the user
objAppVisible = true;
objAppUserControl = true;
}
catch( Exception theException )
{
String errorMessage;
errorMessage = Error: ;
errorMessage = StringConcat( errorMessage theExceptionMessage );
errorMessage = StringConcat( errorMessage Line: );
errorMessage = StringConcat( errorMessage theExceptionSource );
MessageBoxShow( errorMessage Error );
}
}
滚动到代码窗口的顶部将下面的代码行添加到 using 指令列表的末尾using SystemReflection;
using Excel = MicrosoftOfficeInteropExcel;
晚期绑定
与早期绑定不同晚期绑定要等到运行时才会将属性和方法调用绑定到它们的对象为此目标对象必须实现一个特殊的 COM 接口IDispatch利用 IDispatch::GetIDsOfNames 方法Visual C# 可以询问对象支持哪些方法和属性然后IDispatch::Invoke 方法允许 Visual C# 调用这些方法和属性这种晚期绑定的优点是它消除了早期绑定所固有的某些版本依赖性然而它也有以下缺点省略了对自动化代码完整性的编译时检查也不提供智能感知功能(该功能可提供有助于正确调用方法和属性的提示)
要在 Visual C# 中使用晚期绑定请使用 SystemTypeInvokeMember 方法此方法调用 IDispatch::GetIDsOfNames 和 IDispatch::Invoke 来绑定到自动化服务器的方法和属性
创建使用晚期绑定的自动化客户端
启动 Microsoft Visual Studio NET在文件菜单上单击新建然后单击项目从 Visual C# 项目类型中选择 Windows 应用程序默认情况下会创建 Form
在视图菜单上选择工具箱以显示工具箱然后向 Form 添加一个按钮
双击 Button将出现该窗体的代码窗口
在代码窗口中将以下代码 private void button_Click(object sender SystemEventArgs e)
{
}
替换为private void button_Click(object sender SystemEventArgs e)
{
object objApp_Late;
object objBook_Late;
object objBooks_Late;
object objSheets_Late;
object objSheet_Late;
object objRange_Late;
object[] Parameters;
try
{
// Instantiate Excel
objApp_Late = (object)new ExcelApplication();
//Get the workbooks collection
objBooks_Late = objApp_LateGetType()InvokeMember( Workbooks
BindingFlagsGetProperty null objApp_Late null );
//Add a new workbook
objBook_Late = objBooks_LateGetType()InvokeMember( Add
BindingFlagsInvokeMethod null objBooks_Late null );
//Get the worksheets collection
objSheets_Late = objBook_LateGetType()InvokeMember( Worksheets
BindingFlagsGetProperty null objBook_Late null );
//Get the first worksheet
Parameters = new Object[];
Parameters[] = ;
objSheet_Late = objSheets_LateGetType()InvokeMember( Item
BindingFlagsGetProperty null objSheets_Late Parameters );
//Get a range object that contains cell A
Parameters = new Object[];
Parameters[] = A;
Parameters[] = MissingValue;
objRange_Late = objSheet_LateGetType()InvokeMember( Range
BindingFlagsGetProperty null objSheet_Late Parameters ); //Write Hello World! in cell A
Parameters = new Object[];
Parameters[] = Hello World!;
objRange_LateGetType()InvokeMember( Value BindingFlagsSetProperty
null objRange_Late Parameters );
//Return control of Excel to the user
Parameters = new Object[];
Parameters[] = true;
objApp_LateGetType()InvokeMember( Visible BindingFlagsSetProperty
null objApp_Late Parameters );
objApp_LateGetType()InvokeMember( UserControl BindingFlagsSetProperty
null objApp_Late Parameters );
}
catch( Exception theException )
{
String errorMessage;
errorMessage = Error: ;
errorMessage = StringConcat( errorMessage theExceptionMessage );
errorMessage = StringConcat( errorMessage Line: );
errorMessage = StringConcat( errorMessage theExceptionSource );
MessageBoxShow( errorMessage Error );
}
}
滚动到代码窗口的顶部将下面的代码行添加到 using 指令列表的末尾using SystemReflection;