Упорядочивание параметра «как строка» из C#

Столкнулся с интересной проблемой, которую мне было интересно, может ли кто-нибудь помочь объяснить. Я пробовал искать в Интернете и, похоже, не нашел ответа на эту проблему. Хотя у нас есть решение, другие могут столкнуться с той же проблемой, и, поскольку она была случайной, ее очень сложно отследить.

У нас есть приложение, которое случайным образом дает сбой, когда компьютер подключен к корпоративной сети клиента (нет большого количества информации в сети). Когда мы принесли компьютер в нашу среду, он работал нормально. Сбой довольно случайный, но, насколько я мог понять, он произошел во время вызовов из C# неуправляемой DLL стороннего поставщика. Одна из обратных трассировок, которые у меня есть (только пара сбоев предоставили трассировки в журнале системных событий), указывает на сбой в ntdll.dll в функции RtlMoveMemory во время сортировки параметров при вызовах неуправляемой DLL.

Вызов неуправляемой функции:

ThirdParty.CxxxAutomationWrapper clientDLL = new ThirdParty.CxxxAutomationWrapper () ;

object Parameter1 ;
  :
string theValue = "abcde" ;
Parameter1 = theValue ;
  :
if ( Parameter1 is string )
{
    int returnCode = clientDLL.function ( Parameter1 as string ) ;
}

Вызов периодически завершается сбоем на компьютере клиента, но всегда работает при запуске в Visual Studio (2010). Значение Parameter1 установлено правильно (никогда не равно null).

Поскольку я изменил вызов на:

String parameter1String = Parameter1.ToString() ;
int returnCode = clientDLL.function ( parameter1String ) ;

, все заработало нормально. Значение Parameter1 строго контролируется и не равно нулю до выполнения этого кода.

Вызываемый интерфейс (clientDLL.function) определяется как:

HRESULT function ( [in] BSTR parameter,
                   [out, retval] long *ret);

С моим [ограниченным?] пониманием оператора as в C# я не понимаю, почему первая версия этого не удалась. Кто-нибудь может помочь объяснить, почему это не работает при вызове с параметром, указанным как «строка»?

5
задан Richard Bousman 10 May 2012 в 16:56
поделиться