Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
COM方法调用在C#、VB.NET中失败,但在Python中可以工作_C#_.net_Com_Dcom_Variant - Fatal编程技术网

COM方法调用在C#、VB.NET中失败,但在Python中可以工作

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库时,我可能直

我尝试使用的COM库有问题。当我调用一个特定的方法并将其传递给null时,我得到一个ArgumentException。在C#项目和VB.NET项目(我使用
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-Try
System.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