COM方法调用在C#、VB.NET中失败,但在Python中可以工作
我尝试使用的COM库有问题。当我调用一个特定的方法并将其传递给null时,我得到一个ArgumentException。在C#项目和VB.NET项目(我使用COM方法调用在C#、VB.NET中失败,但在Python中可以工作,c#,.net,com,dcom,variant,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库时,我可能直
Nothing
)调用该方法)中都会发生这种情况,我在Visual Studio 2008中从“COM”列表中添加了库引用。当我在Python中调用相同的方法时,传入None
,该方法按预期工作,没有错误。据我所知,Python通过DCOM与COM库交互(我对这意味着什么只有最模糊的概念),而当我在C#/VB.NET项目中引用COM库时,我可能直接使用COM库。是否会发生一些事情,导致我传递的参数在到达COM库之前出错?我不知道这里发生了什么。我最近将COM库更新为一个新版本,因此我想知道可能是因为某个地方的版本冲突导致了异常。我从C#和VB.NET项目中删除了对COM库的所有引用,删除了所有bin
和obj
目录,并重新添加了引用。这确实导致出现在obj
中的Interop.mycmlibrary.dll文件具有今天的日期,而不是我看到的旧日期
我仅有的COM库文档对该方法进行了如下描述:
Public Function AddItem( _
ByVal ItemData As Variant _
) As Object
我现在正在尝试搜索有关变量参数的问题
Edit:因此,当键入.Missing
和其他解决方案可以让我顺利通过该方法调用时,尝试从该方法读取返回项的某些字符串属性会导致:
System.Runtime.InteropServices.COMException:项不存在
这是另一个例子,它在Python中工作,但在C#中抛出了一个异常,所以我猜DCOM比COM更奇怪。或者这可能是一个线程问题,因为我正在使用MSTest进行测试。您是否尝试使用反射。Missing而不是Nothing/null?是的,null可能不正确。有两种表示“无数据”的变体,如VT_EMPTY、VT_ERROR、VT_NULL。从传递Type.Missing开始。我读到了关于从VB到VB.NET的内容,它说要在.NET中使用对象,因为Variant
不存在。我以前曾尝试传递default(object)
,但没有成功,但我尝试传递new object()
作为参数,并且成功——没有引发异常!我不明白的是,当对象的实例应该是可选参数时,为什么必须传递它。为什么null
无法以某种方式转换为新对象()
在StackOverflow上输入这个问题是我经过两天的困惑后得出这个答案的原因,因为我必须从文档中复制/粘贴确切的方法描述。这时我注意到参数为Variant
,而不是Object
。) 能否尝试使用System.DBNull.Value
作为参数
今天我不得不艰难地找到这一点。
在尝试了答案中的所有建议后,其中一些建议导致引发参数异常,在其他情况下,对AddItem
的调用会自动返回null
我所做的是在VisualStudio解决方案中创建一个新的VB项目,其中一个类使用一个Shared
方法为我执行调用,打算将Null作为参数从VB传递出去。编译器抱怨不再使用Null,建议改用System.DBNull.Value
。这就成功了,正如我后来注意到的,System.DBNull.Value
也在C#项目中工作。我刚才尝试了AddItem(default(System.Reflection.Missing))
,得到了与往常一样的ArgumentException。我不确定你打算如何使用Missing
,所以我只是尝试了default()
@Sarah-TrySystem.Reflection.Missing.Value
@Sarah,@Henk:是的,就像他说的,使用Missing.Value。看起来很有效!Hans建议键入。Missing
,它可以工作,我发现新对象()可以工作。我认为Type.Missing
听起来更可取,因为除非必要,我尽量不使用Reflection
东西。不过,我不知道这两者是否有任何区别。@Sarah:System.Type.Missing实际上设置为等于Type的静态构造函数中的System.Reflection.Missing.Value。我想Type.Missing是在.NET1.0之后添加的,但我不确定。我知道System.Reflection.Missing.Value是我以前对所有可选参数执行此操作的方式。Type.Missing较短,所以我现在使用它。看起来像Type。Missing
有效!我发布了一个关于传递new object()
的答案,但我猜是Type。这里缺少会更好,因为它听起来更接近我想要传递的原始null
。