Ran in ein interessantes Problem, das ich mich fragte, ob jemand helfen kann zu erklären. Ich habe versucht, überall im Internet zu suchen und finde keine Antwort auf dieses Problem. Während wir eine Lösung haben, können andere auf das gleiche Problem stoßen, und da es zufällig war, ist es sehr schwer zu finden.Marshalling "als Zeichenfolge" -Parameter von C#
Wir haben eine Anwendung, die zufällig fehlschlägt, wenn der Computer an das Firmennetzwerk des Kunden angeschlossen ist (haben Sie nicht viele Informationen über das Netzwerk). Als wir den Computer in unsere Umgebung brachten, funktionierte es gut. Der Fehler ist ziemlich zufällig, aber so gut wie ich herausfinden konnte, trat während Anrufen von C# zu einer nicht verwalteten Drittanbieter-DLL auf. Eine der Trace-Backs, die ich habe (nur ein paar Fehler im Systemereignisprotokoll), weist auf einen Fehler in ntdll.dll in der RtlMoveMemory-Funktion während des Marshalling von Parametern in Aufrufen der nicht verwalteten DLL hin.
Der Aufruf an die nicht verwaltete Funktion war:
ThirdParty.CxxxAutomationWrapper clientDLL = new ThirdParty.CxxxAutomationWrapper() ;
object Parameter1 ;
:
string theValue = "abcde" ;
Parameter1 = theValue ;
:
if (Parameter1 is string)
{
int returnCode = clientDLL.function (Parameter1 as string) ;
}
Der Anruf nicht regelmäßig auf dem Computer Kunden aber funktioniert immer, wenn in Visual Studio (2010) laufen. Der Wert von Parameter1 ist korrekt festgelegt (nie null).
Da ich den Aufruf geändert:
String parameter1String = Parameter1.ToString() ;
int returnCode = clientDLL.function (parameter1String) ;
alles hat geklappt hat. Der Wert von Parameter1 wird sehr kontrolliert und ist vor der Ausführung dieses Codes nicht null.
Die Schnittstelle (clientDLL.function) genannt wird, ist wie folgt definiert: [? Eingeschränkt]
HRESULT function ([in] BSTR parameter,
[out, retval] long *ret);
Mit meinem Verständnis für die ‚als‘ Aussage in C#, ich verstehe nicht, warum die erste Version von das ist fehlgeschlagen. Kann jemand erklären, warum dies fehlschlägt, wenn es mit dem als "as string" angegebenen Parameter aufgerufen wird?
Aktualisierte den ursprünglichen Post als Antwort auf Antworten, die ich erhielt, um das Problem zu klären. Zu den Updates gehört das Anzeigen, wie Parameter1 deklariert und zugewiesen wird, und das Einfügen eines if (Parameter1 ist eine Zeichenfolge) um den Aufruf, wie von Tudor vorgeschlagen. –
Können Sie versuchen, zu protokollieren, für welche Werte von 'Parameter1' der Absturz auftritt? Kannst du irgendein Muster sehen? – Tudor
Ich habe den genauen oben gezeigten Code codiert, die Zuweisung zu einer String-Variable fest programmiert, sie mit "abcde" initialisiert und diese Variable dem Parameter1 zugewiesen, indem ich sie über if (Parameter1 ist eine Zeichenkette) getestet habe und trotzdem in Visual Studio funktioniert von VS (manchmal). –