我构建了一个引用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版本。
答案 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是工作表。