mshtml.HTMLInputElement.name COMException

Я видел аналогичную проблему при использовании mshtml.dll, на которую ссылаются в наших проектах .NET, но ничего не имело отношения к этой конкретной ситуации. Я подозреваю, что проблема может иметь какое-то отношение к тому, что было сказано в этой теме (.net document write с mshtml) о том, что в моем случае в коклассе отсутствуют все связанные свойства/атрибуты. Особенность здесь в том, что я использую mshtml.HTMLInputElement и набор его свойств/атрибутов при анализе объекта WebBrowser.Document:

if (domElement is HTMLInputElement)
{

  HTMLInputElement inputElement = (HTMLInputElement)domElement;

  if (inputElement.name == null || inputElement.name.Trim() == string.Empty ||
      inputElement.name.Contains("/") || inputElement.name.Contains("="))
  {
    ...

  }

}

Вышеупомянутое отлично работает на ПК для разработки (VS2008 3.5 SP1), где помимо свойства name также успешно вызываются некоторые другие свойства, такие как type и т. д., но когда приложение установлено под Windows 7, в которой есть все необходимые части фреймворка, я получаю COMException:

==============

System.Runtime.InteropServices.COMException пересек собственную/управляемую границу Сообщение = Участник не найден. (Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND)) Source=mscorlib
ErrorCode=-2147352573 StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData) at mshtml.DisementpHTMLInput .get_name()

======================

Ни один из вызовов таких свойств, как name, type, сейчас не работает. Всегда выбрасывается одно и то же Interop.COMException. Мне кажется, что та же проблема описана в документе .net, написанном с помощью mshtml.

Кто-нибудь знает правильный обходной путь для этой проблемы?


person rlazo    schedule 11.02.2013    source источник
comment
Присутствие элемента mshtml.DispHTMLInputElement с поздней привязкой в ​​сообщении об исключении очень сложно объяснить с помощью этого фрагмента кода.   -  person Hans Passant    schedule 12.02.2013
comment
если вы откроете метаданные HTMLInputElement, вы увидите, что он на самом деле наследует/реализует интерфейсы: DispHTMLInputElement, HTMLInputTextElementEvents_Event. Вот почему DispHTMLInputElement появляется во фрагменте, который я ввел выше.   -  person rlazo    schedule 12.02.2013
comment
ПРОБЛЕМА РЕШЕНА... Наконец мы смогли найти основную причину проблемы, о которой мы писали выше. Похоже, что под Windows 7 .NET 4.5 Framework все КАК-ТО попадает в тип HTMLInputElement, я имею в виду условие: if (domElement is HTMLInputElement) оценивает TRUE несмотря на то, что нижележащий объект НЕ ЯВЛЯЕТСЯ НАСТОЯЩИМ HTMLInputElement, а это причина, по которой я получил COMException. В WindowsXP .NET 3.5 SP1 проблема не возникает, настоящий HTMLInputElement — единственный, который делает условие истинным. Я не знаю, как майкрософт допустил такое...   -  person rlazo    schedule 13.02.2013
comment
Решение здесь будет заключаться в том, что вместо того, чтобы запрашивать только HTMLInputElement, мы должны также запрашивать IHTMLInputElement в нашем if: if(domElement is IHTMLInputElement && domElement is HTMLInputElement ) {..} Это позволит избежать попадания чего-либо еще в блок if. Или будет лучше запросить ТОЛЬКО IHTMLInputElement в операторе if(). Поэтому НИКОГДА НЕ используйте оператор IS против конкретного типа класса ниже 4.5, но вместо этого безопаснее использовать его против интерфейса.   -  person rlazo    schedule 13.02.2013
comment
Благодарю вас! У меня была такая же проблема, но со свойствами HTMLDocument вместо HTMLInputElement. Я переключился на IHTMLDocument2, вроде работает. Это также похоже на какое-то обновление для Windows или IE, которое было выпущено, поскольку я начал получать это после применения обновлений. (Возможно, я обновился до IE 10.) И под конкретными типами, я думаю, вы имеете в виду конкретные COM-типы из mshtml.   -  person jpmc26    schedule 25.10.2013
comment
Упс. Забыл @user2062949   -  person jpmc26    schedule 01.11.2013
comment
@jpmc26 jpmc26 большое спасибо, мы тоже решили проблему. Это было только в конкретной рабочей среде, где это просто не работало, и ваше решение решило это для нас.   -  person omerts    schedule 23.01.2017