代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

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

  •  3
  • Sarah Vessels  · 技术社区  · 14 年前

    null . 在一个C项目和一个VB.NET版项目(我使用 Nothing )我在Visual Studio 2008的“COM”列表中添加了库引用。当我在Python中调用相同的方法时,传入 None ,方法按预期工作,没有错误。我的理解是,Python通过DCOM与COM库交互(我只有最模糊的概念这意味着什么),而当我在C中引用COM库时,我可能直接使用它#/VB.NET版项目。会不会有什么事情会导致我传递的参数在到达COM库之前被弄糟?我不知道这里发生了什么。我最近将COM库更新到了一个新版本,所以我想知道是否在某个地方发生了版本冲突,从而导致了异常。我从我的C#中删除了对COM库的所有引用VB.NET版项目,全部删除 bin obj 目标 今天的约会而不是以前的约会。

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

    Variant 参数现在。

    编辑: Type.Missing 其他的解决方案可以让我顺利通过该方法调用,尝试从该方法读取返回项上的某些字符串属性,结果是:

    System.Runtime.InteropServices服务.COMException:项不存在。

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    是的,空不太可能是正确的。有几个变量表示“无数据”,如VT_EMPTY、VT_ERROR、VT_NULL。从路过开始类型。缺少.

        2
  •  2
  •   Richard Anthony Hein    14 年前

    你试过用反射。丢失而不是无/空?

        3
  •  1
  •   Sarah Vessels    14 年前

    this article 关于从VB到VB.NET版它说要用 object 在.NET中 Variant 不存在。我以前试过传球 default(object) ,这不起作用,但我试着通过 new object() 作为参数,这是有效的——没有抛出异常!我不明白的是,当一个对象的实例应该是一个可选参数时,为什么它必须被传递。为什么 null 不会被翻译成

    在StackOverflow上输入这个问题是我在困惑了两天后得到这个答案的原因,因为我必须复制/粘贴文档中的方法描述。就在那时我注意到 变体 而不是 Object

        4
  •  0
  •   Mike Moe    14 年前

    System.DBNull.Value 作为争论?

    在尝试了答案中的所有建议之后,其中一些建议导致引发了一个参数异常,在其他情况下,调用 AddItem 默默地回来 null .

    Shared 方法,该方法调用了我,打算从VB中传递Null作为参数。编译器抱怨不再使用Null,建议使用 System.DBNull.Value值 System.DBNull.Value值 也曾参与过C#项目。