どのようにそれを避けるために - DLLのランタイムエラーは、私のC#のアプリがクラッシュ?
-
18-09-2019 - |
質問
私の窓のアプリの中で、私は(特に - クイックフィックスエンジン)の.NETのDLLに包まれたC ++ DLLを使用しています。 実行中に、一回毎日が(ない任意の特定の時点で)、ビルトインクラスのいずれかのコンストラクタの一つでランタイムエラーがスローされます。 エラーがキャッチされ、報告された(ログファイルに、データベース)されていますが、私はまだ(無回復/デバッグオプションを提供しています)Windowsの実行時エラー 'ダイアログを取得し、「OK」ボタン(一つだけを押した後利用可能)私のアプリを終了します。
デバッグ、リリースにもVS2005のデバッガ自体の内部で実行中に実行しているときにこれが起こります。
サイドノートとして、私は(それらの少なくとも1つは、XML仕様に基づいて自動生成されたコードを含むので)ローカル上記DLLをコンパイルしている。
誰ですか? (詳細は続く)
私のコード:
try
{
QuickFix.Symbol Symbol = new QuickFix.Symbol();
report.get(Symbol);
PairsType instrument = ToPairType(Symbol.getValue());
if (PairsType.NONE == instrument)
return;
QuickFix.MDEntryDate entryDate = new MDEntryDate();
QuickFix.MDEntryTime entryTime = new MDEntryTime();
QuickFix.QuoteCondition quoteCondition = new QuoteCondition();
QuickFix.MDEntryPx MDEntryPxBid = new QuickFix.MDEntryPx();
QuickFix.MDEntryPx MDEntryPxAsk = new QuickFix.MDEntryPx();
QuickFix.NoMDEntries noMDEntries = new QuickFix.NoMDEntries();
report.get(noMDEntries);
for (uint i = 1; i <= noMDEntries.getValue(); ++i)
{
QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries group =
new QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries();
report.getGroup(i, group);
if (group.isSetQuoteCondition())
group.get(quoteCondition);
if (group.isSetMDEntryDate())
group.get(entryDate);
if (group.isSetMDEntryTime())
group.get(entryTime);
switch (group.getMDEntryType().getValue())
{
case MDEntryType.BID:
group.get(MDEntryPxBid);
break;
case MDEntryType.OFFER:
group.get(MDEntryPxAsk);
break;
}
}
// use data...
}
catch (Exception e)
{
// log the error
}
エラーの詳細: メッセージ:外部コンポーネントが例外をスローしました スタックトレースます:
at FIX.message_order.=(message_order* , message_order* )
at std._Tree_nod<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree_nod<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
at std._Tree<std::_Tmap_traits<int,FIX::FieldBase,FIX::message_order,std::allocator<std::pair<int const ,FIX::FieldBase> >,1> >.{ctor}(_Tree<std::_Tmap_traits<int\,FIX::FieldBase\,FIX::message_order\,std::allocator<std::pair<int const \,FIX::FieldBase> >\,1> >* , message_order* _Parg, allocator<std::pair<int const \,FIX::FieldBase> >* _Al)
at FIX.FieldMap.{ctor}(FieldMap* , Int32* order)
at QuickFix.Group..ctor(Int32 field, Int32 delim, Int32[] message_order)
at QuickFix44.MarketDataSnapshotFullRefresh.NoMDEntries..ctor()
at PriceProviders.PriceProvider.onMarketDataRefresh(FixSession session, MarketDataSnapshotFullRefresh report)
解決
あなたは、別のAppDomainにクイックフィックスDLLを読み込むことができます。つまり、予期せず終了からアプリケーションを保護する。
あなたはあなたのメインプログラムからアプリケーションドメイン終結のためにテストし、必要なときにそれをリロードすることができます。
アプリケーションドメイン
http://msdn.microsoft.com/en-us /library/system.appdomain.aspxする
それらを使用してアプリケーションを構築する上で、もう少し情報
http://msdn.microsoft.com/ EN-US /ライブラリ/ yk22e11a(VS.71).aspxのの
私はあなたがC ++コードへのアクセスが、していないと仮定しています。嫌...何厄介な「石膏」のフィックスます。
他のヒント
あなたはDLL内のバグを指しているスタックトレースを持っているように見えます。
あなたがそのコードを持っていますか?それはあなたがにスタックトレースを転送することができます誰かによってサポートされていますか?
この あなたは、コードをコントロールしていないときではない推奨される解決策はなく、いつか一つだけが利用できる< - DLL自体を固定せず、あなたがそれらの周りのクラッシュや仕事を引き起こし、あなたのコード内の例を特定しない限り、問題は、発生していきます。 / P>