在.NET 4.0中嵌入interop程序集时,Excel get_Range丢失

时间:2010-02-03 15:19:16

标签: .net excel interop .net-4.0 com-interop

我构建了一个引用COM互操作DLL的程序集。如果我通过在Reference的属性(VS2010)中将Embed Interop Types设置为True来嵌入COM互操作类型,则在运行时会发生错误“对象不包含get_Range的定义”。如果未嵌入COM互操作类型,则不会发生错误。

有谁知道为什么应该省略特定方法,Worksheet.get_Range或如何解决此问题或有任何其他相关见解?我应该感激任何帮助。

interop dll包含对Worksheet.get_Range(object,[object])的引用。在我的调用程序集中使用反射器,在工作表下没有提到get_Range。

我嵌入的互操作程序集是从Excel9.olb生成的。我没有使用PIA,因为该应用程序针对多个Excel版本。

2 个答案:

答案 0 :(得分:10)

我自己还没有尝试过这个,但是我相信在C#4.0下使用嵌入式COM Interop类型时,语法已经改变了更多的“C#friendly”语法。

因此,您可以省略可选参数(而不是必须提供get_Range(object, [object])),而不是查找Type.Missing方法,或者您可以避免完全调用get访问器,而是引用使用方括号的属性名称:

// 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"];

从我的理解,你应该仍然可以称之为“旧方式”,新的索引器语法实际上是在幕后调用所需的'get'和'set'访问器,所以我不知道我真的知道你遇到麻烦的原因。我的猜测是,您需要在智能感知列表中查看Worksheet.Range而不是Worksheet.get_Range。如果这对您不起作用,那么您的设置或安装可能会出现问题。

有关详情,请参阅Kirill Osenkov的Indexed Properties in C# 4.0

希望这会有所帮助......

麦克

答案 1 :(得分:1)

这是微软在测试阶段https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=530769&wa=wsignin1.0发现的一个错误,在RTM之后被解析为By Design。 Mike Rosenblum的答案在那里获得批准。

这可以概括为Excel.Range r = sh.Range [sh.Cells [1,1],sh.Cells [2,2]];其中sh是工作表。