互操作程序集embedded到.NET 4.0中时缺lessExcel get_Range

我build立一个引用COM interop DLL的程序集。 如果通过在引用的属性(VS2010)中将Embed Interop Types设置为True来embeddedCOM互操作types,则在运行时会发生错误“对象不包含get_Range的定义”。 如果COM互操作types没有embedded,则不会发生错误。

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

interop dll包含对Worksheet.get_Range(object,[object])的引用。 在我的调用程序集上使用reflection器时,没有提及Worksheet下的get_Range。

我embedded的互操作程序集是从Excel9.olb生成的。 我不使用PIA作为应用程序的目标多个Excel版本。

我还没有尝试过,但是我相信,在C#4.0下使用embedded式COM Interoptypes时,语法已经改变了,使其更加“C#友好”的语法。

因此,可以不用查找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”访问器,所以我不知道为什么你有麻烦。 我的猜测是,你需要查看在IntelliSense列表中的Worksheet.Range而不是Worksheet.get_Range 。 如果这对您不适用,那么您的设置或安装听起来可能是错误的。

有关详细信息,请参阅:Kirill Osenkov 在C#4.0中的索引属性 。

希望这可以帮助…

麦克风

这是微软在testing阶段提出的一个错误,在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是一个工作表。