2011-11-21 87 views
3

我想通過下面的代碼來訪問Excel文件時:C#系統.__ ComObject返回訪問Excel文件

Microsoft.Office.Interop.Excel.Application ObjExcel 
    = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel.Workbook book; 
Microsoft.Office.Interop.Excel.Worksheet sheet; 
Excel.Range range1 = null, range2 = null; 
CultureInfo ci = new CultureInfo("en-US"); 
Thread thisThread = Thread.CurrentThread; 
thisThread.CurrentCulture = new CultureInfo("en-US"); 
book = ObjExcel.Workbooks.Open(LinguisticInstructionsFileName); 

在本書變量的最後一行內容爲System.__ComObject,而在不同的應用程序代碼工作和變量...Excel.WorkbookClass

所以我想問一下這個奇怪的行爲可能是什麼原因。我已經嘗試調用Workbooks.Open與額外的Missing.Value參數,但結果是相同的。

回答

2

.NET COM實現使用代理對象,這些代理在內部生成並從System .__ ComObject派生,因此這是正常行爲。 它們是一種「動態物體」。 您可以將__ComObject強制轉換爲您需要的接口或類。 您可以將其強制轉換爲WorkbookClass而不會出現問題。

這一切都取決於你如何得到實例...如果你創建一個新的對象,例如new WorkbookClass,C#將直接創建強類型對象。 相反,如果對象是從COM函數或屬性返回的,它通常會返回一個__ComObject,這是因爲__ComObject幾乎可以是所有內容,並且可以被轉換爲多個接口,當然C#不知道該返回什麼,所以它返回這個特殊的「動態」對象。這些對象稱爲RCW,代表運行時可調用包裝器。

一個不錯的閱讀可以http://www.codeproject.com/KB/cs/cominteropnet.aspx

+0

謝謝你的迴應。在此期間,我將項目切換到.NET 3.5,並使其工作。 但是我會試着讓它在4.0上工作 – Piotroslav