2010-02-03 44 views
7

我構建了一個引用COM互操作DLL的程序集。如果我通過在引用的屬性(VS2010)中將Embed Interop Types設置爲True來嵌入COM互操作類型,則在運行時發生錯誤「對象不包含get_Range的定義」。如果COM互操作類型沒有嵌入,則不會發生錯誤。互操作程序集嵌入到.NET 4.0中時Excel get_Range丟失

有沒有人知道爲什麼應該省略一個特定的方法,Worksheet.get_Range或者如何解決這個問題或者有其他相關的見解?我應該感謝任何幫助。

interop dll包含對Worksheet.get_Range(object,[object])的引用。在我的調用程序集上使用反射器時,沒有提及Worksheet下的get_Range。

我嵌入的互操作程序集是從Excel9.olb生成的。我沒有使用PIA,因爲該應用程序針對多個Excel版本。

回答

10

我還沒有嘗試過這一點,但我相信在C#4.0下使用嵌入式COM Interop類型時,語法已經更改爲更「C#友好」的語法。

因此,您可以忽略可選參數(而不必提供Type.Missing),也可以避免完全調用get訪問器,而是使用方括號引用屬性名稱,而不是查找get_Range(object, [object])方法:

// Using C# 3.0: 
Excel.Range range = worksheet.get_Range("A1", Type.Missing); 

// Using C# 4.0, omitting the optional parameter: 
Excel.Range range = worksheet.get_Range("A1"); 

// Using C# 4.0, utilizing square-bracket indexing: 
Excel.Range range = worksheet.Range["A1"]; 

從我個人理解,但是,你應該仍然能夠稱之爲「老辦法」,其中新索引語法實際上調用所需的「得到」和「設置」幕後訪問,所以我不知道你爲什麼遇到麻煩。我的猜測是,您需要在IntelliSense列表中查找Worksheet.Range而不是Worksheet.get_Range。如果這不適合你,那麼這聽起來像是你的設置或安裝可能有問題。

欲瞭解更多信息,請參閱:Kirill Osenkov的Indexed Properties in C# 4.0

希望這有助於...

邁克

+0

MIKE,謝謝你的幫助。單參數方法不會得到運行時錯誤,顯然是一個很好的解決方法。我已向Microsoft 530769提交了一個錯誤報告。 – mikemay 2010-02-04 10:53:04

+1

https://connect.microsoft.com/VisualStudio/feedback/details/530769/get-range-method-missing-with-embedded-interop-assembly?wa=wsignin1.0 – mikemay 2010-02-11 10:03:14

+0

嗯,對,我在我以前的評論中發佈了一個不好的鏈接,謝謝你的糾正。這裏的討論非常有趣,而且很有意義。但是,請問,現在不是最簡單的解決方案,現在只需使用'worksheet.Range [「A1」]'語法而不是舊的'worksheet.get_Range(「A1」,Type.Missing)''使用C#4.0?你已經發現了一個非常有趣的好奇心,但是爲了修復它自己的代碼,使用新的語法看起來最簡單也是最好的 - 在任何情況下都更容易閱讀(按設計!)。 – 2010-02-11 13:41:09

相關問題