誰かが説明を手伝ってくれるかどうか疑問に思っていた興味深い問題に遭遇しました。インターネット全体を検索してみましたが、この問題に対する答えが見つからないようです。私たちには解決策がありますが、他の人が同じ問題に遭遇する可能性があり、ランダムであるため、追跡するのは非常に困難です.
コンピューターが顧客の企業ネットワークに接続されている場合 (ネットワーク上に多くの情報がない場合)、ランダムに失敗するアプリケーションがあります。コンピューターを私たちの環境に持ち込んだとき、問題なく動作しました。エラーはかなりランダムですが、C# から管理されていないサード パーティ ベンダーの DLL への呼び出し中に発生したことがわかりました。私が持っているトレース バックの 1 つ (システム イベント ログにトレースを提供する 2 つのエラーのみ) は、アンマネージ DLL への呼び出しでのパラメーターのマーシャリング中の RtlMoveMemory 関数の ntdll.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 の値は厳密に制御されており、このコードが実行される前は null ではありません。
呼び出されるインターフェイス (clientDLL.function) は次のように定義されます。
HRESULT function ( [in] BSTR parameter,
[out, retval] long *ret);
C# の 'as' ステートメントについての [限られた?] 理解では、この最初のバージョンが失敗した理由がわかりません。「文字列として」指定されたパラメーターで呼び出されたときにこれが失敗する理由を説明できる人はいますか?