2011-12-07 7 views
1

C#とVB.NET(3.5)の混在したWebソリューションがあります(注:いくつかのvb.netファイルにはOption Strict Offがあります)。私たちのコードは、DotNetNuke 4.8の中でモジュールとして動作します。特定の条件下では、我々のアプリケーションは、この方法でクラッシュします:シリアライゼーションの投げArgumentException/InvalidCastException:デバッグのアプローチが必要

System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString 

その例外では省略メッセージは次のとおりです。

スタックトレース内のどこにも
System.ArgumentException: "Error serializing value XYZ of type XYZ." 
System.InvalidCastException: "Unable to cast object of type 'System.Int64' 
to 'System.String'" 

が我々のコードで、それが終わるだけでシステムのコードですコードからタイプXYZをシリアル化できませんでした。これは私がブレークポイントを打つことはできませんし、XYZの正確なプロパティが問題であるデバッグを意味します。スタックトレースプロパティは空ですが、メッセージにと略記スタックトレースです:

DotNetNuke.Services.Exceptions.PageLoadException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.ArgumentException: "Error serializing value 'XYZ' of type 'XYZ.'" 
    System.InvalidCastException: "Unable to cast object of type 'System.Int64' to type 'System.String'. " 
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject) 
// ...... etc......... 
at System.Web.UI.Page.SaveAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
// --- End of inner exception stack trace 

このトレースのすべての関連する行はSystem.で始まります。上の行はDotNetNukeです。しかし、最初の答えの提案に続いて私はDotNetNuke(4.8)コードを自分でコンパイルし、そのコードはServer.GetLastErrorで、実際の値やプロパティ名がシリアル化されていることを知らないInnerExceptionとしてInvalidExceptionを示しています。

質問はです:シリアライザで問題が発生しているフィールドと値を知る方法を教えてください。この問題を調査しながら、頭に浮かんだ

関連するいくつかの質問/問題:私はMSDNのFormatters.Binary一部を見れば、コメントで提案されているように

  • 私は(ObjectWriterバイナリための内部だと思いたいです、 赤)?
  • .NETを使用してInt64をStringにキャストしてもどうして失敗するのですか?言い換えれば、Int64のどの値が文字列に変換されない可能性がありますか?しかし、コメントで指摘されているように、Int64はStringsに簡単に変換できますが、キャストするのは別の問題です。
  • Serializeメソッドは、このArgumentExceptionまたはInvalidCastExceptionが(例外セクションで)発生する可能性があることを通知しません。

私は、任意の不規則性を確認するためにILDASMにそのクラスのプロパティのXYZと種類を調査してみましたが、いずれも見つけることができませんでした。

+1

'(文字列)42L'はInvalidCastExceptionをスローし、その他のInt64値もスローします。 Int64値は 'string'にキャストできません。 ( 'Convert.ToString(42L)'や '42L.ToString()'を使って**文字列に変換することができます) – dtb

+1

'ObjectWriter'は、' System.Runtime 'の 'internal'クラスです。 Serialization.Formatters.Binary'名前空間。 – dtb

+0

両方の有益なコメントありがとう!意味をなさないこの部分の質問を更新すると思います。 – Jeroen

答えて

0

自分の質問に答えると、検索クエリの後に誰かがここに来るのを助けることができればうれしいことです。

最終回答はthis SO questionです。私はmscorlibコードにステップインする.NET Reflectorの試用版(およびVisual Studio 2010プラグインを含む)を使用して終了しました。これにより、InvalidCastExceptionの原因となっていたプロパティのNameInfoを調べることができました。

簡潔に言えば、答えは:.NET Reflector(または同様のツール)を使用してmscorlibにステップインします。


PS。 mscorlibに足を踏み入ろうとすると、私の問題はこの質問に答えることができましたが、十分な情報を得ると、まったく新しいSOの質問が必要な根本的な問題が残っています。

+0

DNNフレームワーク内にある場合は、Geminiにログインすることを忘れないでくださいその答えは、無効なキャストをキャッチして報告することです。 –

+0

私は最終的に、DNNが 'Server.GetLastError'の問題に気付く以外は何もしていないと思います。もし私がこれについて何かを見つけたら、私は思うだろう。この質問のすべてのヒントとフィードバックをありがとう:D – Jeroen

2

スタックトレースの内容については言及していませんでしたが、それは関係ないかもしれません。

DotNetNukeコードにある場合は、DotNetNukeソースをデバッガに読み込み、例外を再作成します。また、関連するバージョンのDotNetNukeソースをコンパイルして、新しくコンパイルされたdllファイルと.pdbファイルを\ binディレクトリにドロップすることもできます。

セットアップが完了したら、Visual Studio - > Debug、Exceptionsに移動し、[Thrown]列に[Common Language Runtime Exceptions]の横にチェックボックスを入れます。また、「ネイティブランタイムチェック」を試すこともできます。

次に、テストを再作成します。例外がスローされた時点でコードが破損するはずです。これが起こると、スタックポイントの取得方法のスタックトレースだけでなく、問題の原因となっている値を調べることができるはずです。

このアプローチを使用すると、try/catchがコードを処理する方法として使用される場所がたくさんあります。これらはすべて表示されます。必要なものが見つかるまで、これらの例を踏むだけです。

他のすべてがうまくいかない場合は、その中で 'try/catch'を使って再コンパイルし、問題の値をログに記録しますが、それほど遠くに行く必要はありません。 Visual Studioにスローされたエラーをブレークさせるだけで、問題を特定するのに十分なはずです。

+0

アドバイスをいただきありがとうございます。私は確かに私は時間があり、Qを更新し、そして/またはそれが働いた場合は答えを受け入れるときにこれを与える。 – Jeroen

+0

また、スタックトレースの情報で質問を更新します。 – Jeroen

+0

これは良い提案でしたが、残念ながら私の問題に対する答えはありませんでした。私がDotNetNukeでブレークポイントにヒットしたとき、 'Server.GetLastError'を処理しているだけで、InnerException(' InvalidCastException')は実際の値(またはプロパティ)のシリアル化に失敗した情報を提供しません。 – Jeroen

関連する問題