如果您使用.NET 3.5,則不能使用dynamic
關鍵字。您唯一的選擇是使用@Francesco所描述的一系列代理類(手動編寫或自動生成)。但是,如果您需要訪問大量Excel類/函數/屬性,手動方法非常麻煩。你必須爲你需要的每個成員編寫一個函數/屬性代理。
管理這一點的關鍵在於,不是編寫大量的代理函數,而是將處理Excel的所有代碼放在放置在不同庫項目中的單獨軟件層(如數據訪問層,DAL)中。該層僅嚮應用程序提供一些高級接口(只有少數成員函數),以至於應用程序甚至不知道MS Excel自動化的用法。
請注意,即使您不想動態加載程序集,此封裝的Excel訪問代碼也是一種很好的做法。例如,如果您發現令人沮喪,您可以使用另一種技術(如ADO.NET)輕鬆替換Office Automation,並使用Microsoft.ACE.OLEDB.12.0
提供商reading from/writing to Excel files,這在x64平臺內也令您感到沮喪!
例如,如果你想從一個Excel文件,搶板和數據,您可以提供姓名的人士稱Utils.OfficeAutomation
一個項目,裏面的以下接口(沒有提及Microsoft.Office.Interop.Excel.dll
):
interface IExcelLayer {
...
bool ImportFrom(string fileName, string sheetName, out object[,] cells, bool skipHeaderRow = true);
// a few other members...
...
}
然後實現它命名爲一個單獨的項目,說Utils.OfficeAutomation.Impl
,其中引用了兩個Utils.OfficeAutomation
和真實Microsoft.Office.Interop.Excel.dll
:
class ExcelMagician : IExcelLayer {
...
bool ImportFrom(string fileName, string sheetName, out object[,] cells, bool skipHeaderRow = true)
{
Excel.Application excelApp = new Excel.Application()
...
}
...
}
邁n應用程序僅提供Utils.OfficeAutomation
。作爲回報,Utils.OfficeAutomation
是動態查找和加載Utils.OfficeAutomation.Impl
,或者如果出事了產生錯誤莫名其妙負責:
IExcelLayer m_instance = null;
...
try
{
Assembly assembly = Assembly.Load("Utils.OfficeAutomation.Impl");
Type excelType = assembly.GetType("Utils.OfficeAutomation.Impl.ExcelMagician");
m_instance = (IExcelLayer) Activator.CreateInstance(excelType);
}
catch (Exception e)
{
throw new Exception("Couldn't load Excel assembly.")
}
如果沒有安裝Microsoft Excel的一個合適的版本,可加載程序集Utils.OfficeAutomation.Impl
失敗,或致電像ImportFrom
這樣的成員會生成一個異常。
您最後需要在Utils.OfficeAutomation
內編寫包裝類作爲Excel Access Layer或Excel功能的網關。
似乎你使用.NET 3.5而不是.net 4? –
此外,請檢查此解決方法:http://www.codeproject.com/Articles/10888/SafeCOMWrapper-Managed-Disposable-Strongly-Typed-s –