在我的Windows应用程序中,我使用的是包含.NET DLL的c ++ DLL(特别是 - quickfix引擎)。 在运行时,每天运行一次(不是在任何特定时间),在其中一个内置类的构造函数之一中会引发运行时错误。 即使错误被捕获并报告(到日志文件和数据库),我仍然得到windows'运行时错误'对话框(它没有提供恢复/调试选项),并在按下'ok'按钮后(只有一个)我的应用已被终止。
在Debug,Release甚至在VS2005调试器本身内运行时都会发生这种情况。
作为旁注,我在本地编译了上述DLL(因为其中至少有一个包含基于XML规范的自动生成的代码)。
任何? (详情如下)
我的代码:
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)
答案 0 :(得分:0)
您可以在单独的AppDomain中加载QuickFix DLL。这样可以保护您的应用免受意外终止。
您可以测试从主程序终止的应用程序域,并在需要时重新加载。
App域
http://msdn.microsoft.com/en-us/library/system.appdomain.aspx
关于使用它们构建应用程序的更多信息
http://msdn.microsoft.com/en-us/library/yk22e11a(VS.71).aspx
我假设您无法访问C ++代码但是。 Ick ..多么令人讨厌的“石膏”修复。
答案 1 :(得分:0)
看起来你有一个指向DLL内部错误的堆栈跟踪 你有它的代码吗?是否有人可以将堆栈跟踪转发给?
在不修复DLL本身的情况下,问题将继续发生,除非您在代码中识别导致崩溃的情况并解决它们 - 不是推荐的解决方案,但有时只有在您不控制代码时才可用。< / p>