2010-02-03 28 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

相关问题