DLL运行时错误导致我的c#app崩溃 - 如何避免它?

时间:2009-07-22 08:56:58

标签: .net exception dll runtime-error quickfix

在我的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)

2 个答案:

答案 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>