3

使用しようとしているCOMライブラリに問題があります。特定のメソッドを呼び出して渡すと、ArgumentExceptionが発生しnullます。Nothingこれは、Visual Studio 2008の「COM」リストからライブラリ参照を追加したC#プロジェクトとVB.NETプロジェクト(を使用してメソッドを呼び出す)の両方で発生します。Pythonでこれと同じメソッドを呼び出すと、None、メソッドはエラーなしで期待どおりに機能します。PythonはDCOMを介してCOMライブラリと対話することを理解しています(そして、それが何を意味するかについては最も曖昧な概念しかありません)が、C#/VB.NETプロジェクトでCOMライブラリを参照するときにCOMライブラリを直接使用している可能性があります。COMライブラリに到達する前に、渡したパラメータが台無しになるようなことが起こっている可能性がありますか?ここで何が起こっているのかわかりません。最近、COMライブラリを新しいバージョンに更新したので、どこかでバージョンの競合が発生し、例外が発生しているのではないかと思いました。C#およびVB.NETプロジェクトからCOMライブラリへのすべての参照を削除し、すべてbinobjディレクトリを削除して、参照を再度追加しました。これにより、Interop.MyCOMLibrary.dllファイルが次のように表示されます。obj私が見ていた古い日付の代わりに今日の日付を持っていること。

私がCOMライブラリについて持っている唯一のドキュメントは、この方法を次のように説明しています。

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

Variant現在、パラメータに関する問題を探し回っています。

編集:そのためType.Missing、他のソリューションはエラーなしでそのメソッド呼び出しを通過するために機能しますが、そのメソッドから返されたアイテムの特定の文字列プロパティを読み取ろうとすると、次のようになります。

System.Runtime.InteropServices.COMException:アイテムが存在しません。

これはPythonで機能したが、C#で例外をスローしている別の例であるため、DCOM対COMの奇妙さを推測しています。または、MSTestを使用してテストしているため、これはスレッドの問題である可能性があります。

4

4 に答える 4

3

はい、nullは正しくない可能性があります。VT_EMPTY、VT_ERROR、VT_NULLなど、「データなし」を示すバリアントがいくつかあります。Type.Missingを渡すことから始めます。

于 2010-10-07T19:12:01.297 に答える
2

Nothing / nullの代わりにReflection.Missingを使用してみましたか?

于 2010-10-07T19:02:44.077 に答える
1

この記事でVBからVB.NETへの移行について読みましたが、存在しないためobject.NETで使用すると言われています。Variant以前にパスを試しましdefault(object)たが、機能しませんでしたがnew object()、パラメーターとしてパスを試みたところ、機能しました。例外はスローされませんでした。私が理解していないのは、オブジェクトのインスタンスがオプションのパラメーターであると想定されているのに、そのインスタンスを渡さなければならない理由です。どういうわけかnull翻訳されないのnew object()ですか?

StackOverflowでこの質問を入力すると、ドキュメントから正確なメソッドの説明をコピーして貼り付ける必要があったため、2日間困惑した後、この回答にたどり着きました。その時、パラメータのVariant代わりに気づきました。Object:)

于 2010-10-07T19:13:27.113 に答える
0

System.DBNull.Value引数として使ってみませんか?

今日はこれを難しい方法で見つけなければなりませんでした。回答のすべての提案を試した後、それらのいくつかは引数例外がスローされ、他の場合には、への呼び出しがAddItemサイレントに返されnullました。

私が行ったのは、Visual Studioソリューションで新しいVBプロジェクトを作成し、SharedVBから引数としてNullを渡すことを目的として、呼び出しを行った単一のメソッドを持つ単一のクラスを使用することでした。コンパイラは、Nullが使用されなくなったことを訴え、代わりに使用することを提案しましSystem.DBNull.Valueた。これでうまくいき、後で気付いたようSystem.DBNull.Valueに、C#プロジェクトでも機能しました。

于 2011-04-13T19:14:53.323 に答える