相对而言,您可以在C#中使用后期绑定IDispatch绑定.
http://support.microsoft.com/kb/302902
这是使用Excel的一些示例.这样你就不需要在微软臃肿的PIA上添加不必要的依赖:
//Create XL Object xl = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); //Get the workbooks collection. // books = xl.Workbooks; Object books = xl.GetType().InvokeMember( "Workbooks", BindingFlags.GetProperty, null, xl, null); //Add a new workbook. // book = books.Add(); Objet book = books.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, books, null ); //Get the worksheets collection. // sheets = book.Worksheets; Object sheets = book.GetType().InvokeMember( "Worksheets", BindingFlags.GetProperty, null, book, null ); Object[] parameters; //Get the first worksheet. // sheet = sheets.Item[1] parameters = new Object[1]; parameters[0] = 1; Object sheet = sheets.GetType().InvokeMember( "Item", BindingFlags.GetProperty, null, sheets, parameters ); //Get a range object that contains cell A1. // range = sheet.Range["A1]; parameters = new Object[2]; parameters[0] = "A1"; parameters[1] = Missing.Value; Object range = sheet.GetType().InvokeMember( "Range", BindingFlags.GetProperty, null, sheet, parameters ); //Write "Hello, World!" in cell A1. // range.Value = "Hello, World!"; parameters = new Object[1]; parameters[0] = "Hello, World!"; objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, null, range, parameters ); //Return control of Excel to the user. // xl.Visible = true; // xl.UserControl = true; parameters = new Object[1]; parameters[0] = true; xl.GetType().InvokeMember( "Visible", BindingFlags.SetProperty, null, xl, Parameters ); xl.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty, null, xl, Parameters );
thaBadDawg.. 9
你必须等待C#4.0出来才能获得你想要的后期绑定.每当我需要互操作能力时,我都会切换回VB.Net模式,这样我就可以利用C#似乎缺乏的COM功能.
我使用的简单方法是在VB.Net中创建一个类,它执行IDispatch工作,然后公开我想用作包装器方法的方法,然后我可以从我的C#代码中随意调用它们.不是最优雅的解决方案,但它在过去的几个月里让我脱离了一两个.
相对而言,您可以在C#中使用后期绑定IDispatch绑定.
http://support.microsoft.com/kb/302902
这是使用Excel的一些示例.这样你就不需要在微软臃肿的PIA上添加不必要的依赖:
//Create XL Object xl = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); //Get the workbooks collection. // books = xl.Workbooks; Object books = xl.GetType().InvokeMember( "Workbooks", BindingFlags.GetProperty, null, xl, null); //Add a new workbook. // book = books.Add(); Objet book = books.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, books, null ); //Get the worksheets collection. // sheets = book.Worksheets; Object sheets = book.GetType().InvokeMember( "Worksheets", BindingFlags.GetProperty, null, book, null ); Object[] parameters; //Get the first worksheet. // sheet = sheets.Item[1] parameters = new Object[1]; parameters[0] = 1; Object sheet = sheets.GetType().InvokeMember( "Item", BindingFlags.GetProperty, null, sheets, parameters ); //Get a range object that contains cell A1. // range = sheet.Range["A1]; parameters = new Object[2]; parameters[0] = "A1"; parameters[1] = Missing.Value; Object range = sheet.GetType().InvokeMember( "Range", BindingFlags.GetProperty, null, sheet, parameters ); //Write "Hello, World!" in cell A1. // range.Value = "Hello, World!"; parameters = new Object[1]; parameters[0] = "Hello, World!"; objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, null, range, parameters ); //Return control of Excel to the user. // xl.Visible = true; // xl.UserControl = true; parameters = new Object[1]; parameters[0] = true; xl.GetType().InvokeMember( "Visible", BindingFlags.SetProperty, null, xl, Parameters ); xl.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty, null, xl, Parameters );
你必须等待C#4.0出来才能获得你想要的后期绑定.每当我需要互操作能力时,我都会切换回VB.Net模式,这样我就可以利用C#似乎缺乏的COM功能.
我使用的简单方法是在VB.Net中创建一个类,它执行IDispatch工作,然后公开我想用作包装器方法的方法,然后我可以从我的C#代码中随意调用它们.不是最优雅的解决方案,但它在过去的几个月里让我脱离了一两个.
C#4的dynamic
关键字支持IDispatch和后期绑定.您可以阅读Sam Ng的动态系列以获取更多信息
哦,C#4今天只作为CTP提供.您必须等待Visual Studio vNext或使用beta(在Windows Server 2008 Virtual PC上运行)才能使用它.