Сбой вызова метода COM в C #, VB.NET, но работает в Python - PullRequest
3 голосов
/ 07 октября 2010

У меня проблемы с библиотекой COM, которую я пытаюсь использовать. Я получаю ArgumentException, когда вызываю определенный метод и передаю его null. Это происходит со мной как в проекте C #, так и в проекте VB.NET (я вызываю метод, используя Nothing), где я добавил ссылку на библиотеку из списка «COM» в Visual Studio 2008. Когда я вызываю этот же метод в Python , передав None, метод работает, как и ожидалось, без ошибок. Насколько я понимаю, Python взаимодействует с библиотекой COM через DCOM (и у меня есть только самое смутное представление о том, что это значит), в то время как я мог бы использовать библиотеку COM напрямую, когда ссылаюсь на нее в своих проектах на C # / VB.NET. Может ли что-то происходить, что приведет к тому, что параметр, который я передаю, облажается, прежде чем он попадет в библиотеку COM? Я не уверен, что здесь происходит. Недавно я обновил библиотеку COM до более новой версии, поэтому мне стало интересно, не возникло ли где-то конфликта версий, что вызвало исключение. Я удалил все ссылки на библиотеку COM из своих проектов на C # и VB.NET, удалил все каталоги bin и obj и снова добавил ссылку. Это привело к тому, что файл 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 ]

3 голосов
/ 07 октября 2010

Да, ноль вряд ли будет правильным. Есть пара вариантов, которые указывают «нет данных», например VT_EMPTY, VT_ERROR, VT_NULL. Начните с прохождения Type.Missing.

2 голосов
/ 07 октября 2010

Вы пробовали использовать Reflection.Missing вместо Nothing / null?

1 голос
/ 07 октября 2010

Я прочитал в этой статье о переходе от VB к VB.NET, и там говорится, что object используется в .NET, поскольку Variant не существует. Ранее я пытался передать default(object), что не сработало, но я попытался передать new object() в качестве параметра, и это сработало - исключений не было! Чего я не понимаю, так это того, почему экземпляр объекта должен передаваться, если это необязательный параметр. Почему null не переводится как-то на new object()?

Печатание этого вопроса в StackOverflow привело меня к этому ответу после двух дней размышлений над ним, потому что мне пришлось скопировать / вставить точное описание метода из документации. Вот тогда я заметил Variant вместо Object для параметра. :)

0 голосов
/ 13 апреля 2011

Не могли бы вы попробовать использовать System.DBNull.Value в качестве аргумента?

Я должен был найти этот трудный путь сегодня. Перепробовав все предложения в ответах, некоторые из них вызвали исключение аргумента, а в других случаях звонок на AddItem беззвучно возвратил null.

Я создал новый проект VB в Visual Studio Solution с одним классом с одним методом Shared, который вызвал меня, намереваясь передать Null из VB в качестве аргумента. Компилятор пожаловался, что Null больше не используется, и предложил вместо него использовать System.DBNull.Value. Это помогло, и, как я позже заметил, System.DBNull.Value работал и в проекте C #.

...