COM方法调用在C#,VB.NET中失败,但在Python中有效

时间:2010-10-07 18:55:12

标签: c# .net com dcom variant

我正在尝试使用的COM库出现问题。当我调用特定方法并将其传递给null时,我得到一个ArgumentException。在C#项目和VB.NET项目中我都会遇到这种情况(我使用Nothing调用该方法),我在Visual Studio 2008中的“COM”列表中添加了库引用。当我调用同样的方法时在Python中传入None,该方法按预期工作,没有错误。我的理解是Python通过DCOM与COM库交互(我只有最模糊的概念是什么意思)而我可能在我的C#/ VB.NET项目中引用它时直接使用COM库。可能发生的事情会导致我传递的参数在进入COM库之前被搞砸了吗?我不确定这里发生了什么。我最近将COM库更新为更新的版本,所以我想知道是否可能在那里遇到版本冲突,导致异常。我从C#和VB.NET项目中删除了对所有COM库的引用,删除了所有binobj目录,并重新添加了引用。这确实导致显示在obj中的Interop.MyCOMLibrary.dll文件具有今天的日期而不是我以前看到的旧日期。

我对COM库的唯一文档描述了如下方法:

Public Function AddItem( _
   ByVal ItemData As Variant _
) As Object

我正在尝试现在搜索有关Variant参数的问题。

编辑,所以虽然Type.Missing和其他解决方案可以让我无错误地通过该方法调用,但尝试从该方法读取返回项目的某些字符串属性会导致:

  

System.Runtime.InteropServices.COMException:项目不存在。

这是另一个在Python中运行但在C#中抛出异常的例子,所以我猜测更多的DCOM与COM的怪异。或者这可能是一个线程问题,因为我正在使用MSTest进行测试。

4 个答案:

答案 0 :(得分:3)

是的,null可能不正确。有几个变量表示“无数据”,如VT_EMPTY,VT_ERROR,VT_NULL。首先传递Type.Missing。

答案 1 :(得分:2)

您是否尝试使用Reflection.Missing而不是Nothing / null?

答案 2 :(得分:1)

我在this article中读到了关于从VB到VB.NET的问题,它说在.NET中使用object,因为Variant不存在。我以前曾尝试传递default(object),但这不起作用,但我尝试传递new object()作为参数并且有效 - 没有抛出任何异常!我不明白的是为什么当一个对象的实例应该是一个可选参数时必须传递它。为什么null无法以某种方式转换为new object()

在StackOverflow上输入这个问题后,经过两天的困惑,我得到了这个答案,因为我不得不从文档中复制/粘贴确切的方法描述。就在那时我注意到参数Variant而不是Object。 :)

答案 3 :(得分:0)

您可以尝试使用System.DBNull.Value作为参数吗?

今天我必须找到困难的方法。 在尝试了答案中的所有建议之后,其中一些建议引发了一个Argument Exception,而在其他情况下,对AddItem的调用默默地返回null

我所做的是在Visual Studio解决方案中创建一个新的VB项目,其中一个类使用单个Shared方法为我调用,打算从VB传递Null作为参数。编译器抱怨不再使用Null,并建议使用System.DBNull.Value代替。这样做了,我后来注意到,System.DBNull.Value也在C#项目中工作。