2010-10-07 55 views
3

我遇到了一个我正在尝试使用的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方法调用在C#,VB.NET中失败,但在Python中工作

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

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

我试图搜索周围的现在就Variant参数的问题。

编辑:所以虽然Type.Missing和其他解决方案让我过去那种方法调用没有错误,试图从该方法的结果读取返回的项目的某些字符串属性的作用:

系统。 Runtime.InteropServices.COMException:项目不存在。

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

回答

3

是的,null不可能是正确的。有几个变量指示“无数据”,如VT_EMPTY,VT_ERROR,VT_NULL。通过传递Type.Missing开始。

+0

看起来像'Type.Missing'的作品!我发布了一个关于如何传递'new object()'的函数,但我猜''Type.Missing'会更好,因为它听起来更接近我想传递的原始'null'。 – 2010-10-07 19:15:11

2

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

+0

刚才我尝试了'AddItem(默认(System.Reflection.Missing))',并得到了和往常一样的ArgumentException。我不知道你是如何使用'Missing',所以我只是尝试'default()'。 – 2010-10-07 19:08:06

+1

@Sarah尝试'System.Reflection.Missing.Value' – 2010-10-07 19:12:37

+0

@Sarah,@亨克:是的,就像他说的,使用Missing.Value。 – 2010-10-07 19:15:49

1

我在this article中读过关于从VB到VB.NET,它说在.NET中使用object,因为Variant不存在。之前我曾尝试过传递default(object),但没有奏效,但我尝试通过new object()作为参数,并且工作正常 - 没有发生任何异常!我不明白为什么当一个对象的实例应该是一个可选参数时必须被传递。为什么null不知何故被翻译成new object()

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

0

你可以尝试使用System.DBNull.Value作为参数吗?我不得不在今天找到这个难题。 在尝试了答案中的所有建议之后,其中一些引发了参数异常,并且在其他情况下,对AddItem的调用默默返回null

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

相关问题