2010-10-07 20 views
3

我遇到了一個我正在嘗試使用的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方法調用在C#,VB.NET中失敗,但在Python中工作

我對COM庫中的唯一文檔描述的方法如下:

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

我試圖搜索周圍的現在就Variant參數的問題。

編輯:所以雖然Type.Missing和其他解決方案讓我過去那種方法調用沒有錯誤,試圖從該方法的結果讀取返回的項目的某些字符串屬性的作用:

系統。 Runtime.InteropServices.COMException:項目不存在。

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

回答

3

是的,null不可能是正確的。有幾個變量指示「無數據」,如VT_EMPTY,VT_ERROR,VT_NULL。通過傳遞Type.Missing開始。

+0

看起來像'Type.Missing'的作品!我發佈了一個關於如何傳遞'new object()'的函數,但我猜''Type.Missing'會更好,因爲它聽起來更接近我想傳遞的原始'null'。 – 2010-10-07 19:15:11

2

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

+0

剛纔我嘗試了'AddItem(默認(System.Reflection.Missing))',並得到了和往常一樣的ArgumentException。我不知道你是如何使用'Missing',所以我只是嘗試'default()'。 – 2010-10-07 19:08:06

+1

@Sarah嘗試'System.Reflection.Missing.Value' – 2010-10-07 19:12:37

+0

@Sarah,@亨克:是的,就像他說的,使用Missing.Value。 – 2010-10-07 19:15:49

1

我在this article中讀過關於從VB到VB.NET,它說在.NET中使用object,因爲Variant不存在。之前我曾嘗試過傳遞default(object),但沒有奏效,但我嘗試通過new object()作爲參數,並且工作正常 - 沒有發生任何異常!我不明白爲什麼當一個對象的實例應該是一個可選參數時必須被傳遞。爲什麼null不知何故被翻譯成new object()

在StackOverflow上輸入這個問題是讓我對這個問題感到困惑的兩天,因爲我不得不從文檔中複製/粘貼確切的方法描述。那時我注意到Variant而不是Object作爲參數。 :)

0

你可以嘗試使用System.DBNull.Value作爲參數嗎?我不得不在今天找到這個難題。 在嘗試了答案中的所有建議之後,其中一些引發了參數異常,並且在其他情況下,對AddItem的調用默默返回null

我所做的是在Visual Studio解決方案中創建一個新的VB項目,其中一個類只有一個Shared方法,它爲我打了電話,打算從VB傳遞Null作爲參數。編譯器抱怨Null不再使用,並建議使用System.DBNull.Value代替。這個竅門,正如我後來注意到的,System.DBNull.Value也在C#項目中工作。

相關問題