Столкнулся с интересной проблемой, которую мне было интересно, может ли кто-нибудь помочь объяснить. Я пробовал искать в Интернете и, похоже, не нашел ответа на эту проблему. Хотя у нас есть решение, другие могут столкнуться с той же проблемой, и, поскольку она была случайной, ее очень сложно отследить.
У нас есть приложение, которое случайным образом дает сбой, когда компьютер подключен к корпоративной сети клиента (нет большого количества информации в сети). Когда мы принесли компьютер в нашу среду, он работал нормально. Сбой довольно случайный, но, насколько я мог понять, он произошел во время вызовов из 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# я не понимаю, почему первая версия этого не удалась. Кто-нибудь может помочь объяснить, почему это не работает при вызове с параметром, указанным как «строка»?