3

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

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

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

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

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

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

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

4

4 回答 4

3

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

于 2010-10-07T19:12:01.297 回答
2

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

于 2010-10-07T19:02:44.077 回答
1

我在这篇文章中读到了关于从 VB 到 VB.NET 的内容,它说要object在 .NET 中使用,因为Variant不存在。我之前尝试过 pass default(object),但没有成功,但我尝试将new object()其作为参数传递并且有效 - 没有抛出异常!我不明白为什么在应该是可选参数时必须传递对象的实例。为什么不null以某种方式翻译成new object()

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

于 2010-10-07T19:13:27.113 回答
0

您可以尝试System.DBNull.Value用作论据吗?

我今天不得不以艰难的方式找到这一点。在尝试了答案中的所有建议后,其中一些导致 Argument Exception 被抛出,而在其他情况下,调用AddItem静默返回null

我所做的是在 Visual Studio 解决方案中创建一个新的 VB 项目,其中有一个类和一个Shared为我调用的方法,旨在将 VB 中的 Null 作为参数传递。编译器抱怨 Null 不再使用,建议System.DBNull.Value改用。这成功了,正如我后来注意到System.DBNull.Value的那样,它也在 C# 项目中工作。

于 2011-04-13T19:14:53.323 回答