簡體   English   中英

COM方法調用在C#,VB.NET中失敗,但在Python中有效

[英]COM method call fails in C#, VB.NET, but works in Python

我正在嘗試使用的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庫的唯一文檔描述了如下方法:

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

我正在嘗試現在搜索有關Variant參數的問題。

編輯:所以當Type.Missing和其他解決方案工作讓我通過該方法調用沒有錯誤時,嘗試從該方法讀取返回項目的某些字符串屬性導致:

System.Runtime.InteropServices.COMException:項不存在。

這是另一個在Python中工作但在C#中拋出異常的例子,所以我猜測更多的DCOM與COM的怪異。 或者這可能是一個線程問題,因為我正在使用MSTest進行測試。

是的,null不太可能是正確的。 有幾個變量表示“無數據”,如VT_EMPTY,VT_ERROR,VT_NULL。 首先傳遞Type.Missing。

您是否嘗試使用Reflection.Missing而不是Nothing / null?

我在這篇文章中讀到了從VB到VB.NET的問題,它說在.NET中使用object ,因為Variant不存在。 我之前嘗試過傳遞default(object) ,這不起作用,但我嘗試傳遞new object()作為參數,並且工作 - 沒有拋出異常! 我不明白的是為什么當一個對象的實例應該是一個可選參數時必須傳遞它。 為什么null不能以某種方式轉換為new object()

在StackOverflow上輸入這個問題后,經過兩天的困惑,我得到了這個答案,因為我必須從文檔中復制/粘貼確切的方法描述。 那是我注意到Variant而不是Object的參數。 :)

你能嘗試使用System.DBNull.Value作為參數嗎?

我今天必須找到這個艱難的方式。 在嘗試了答案中的所有建議之后,其中一些會導致拋出Argument Exception,而在其他情況下,對AddItem的調用會以靜默方式返回null

我所做的是在Visual Studio解決方案中創建一個新的VB項目,其中一個類具有單個Shared方法,該方法為我調用,打算從VB傳遞Null作為參數。 編譯器抱怨不再使用Null,並建議使用System.DBNull.Value 這樣做了,我后來注意到, System.DBNull.Value也在C#項目中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM