Ошибка DLL во время выполнения программы вылетает из моего приложения на c # - как этого избежать? - PullRequest
2 голосов
/ 22 июля 2009

В моем приложении для Windows я использую DLL-библиотеку c ++, обернутую DLL-библиотеками .NET (в частности, механизмом быстрого исправления). Во время работы один раз в день (не в определенное время) в одном из конструкторов одного из встроенных классов выдается ошибка времени выполнения. Несмотря на то, что ошибка обнаружена и сообщена (в файл журнала и в базу данных), я все равно получаю диалоговое окно «Ошибка времени выполнения» (в котором нет параметров восстановления / отладки) и после нажатия кнопки «ОК» (единственной доступно) мое приложение прекращено.

Это происходит при запуске в 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 голосов
/ 22 июля 2009

Похоже, у вас есть трассировка стека, указывающая на ошибку внутри DLL.
У тебя есть свой код? Поддерживается ли кто-то, кому вы можете переслать трассировку стека?

Без исправления самой DLL проблема будет продолжать возникать, если только вы не определите в своем коде случаи, которые вызывают сбой, и обходите их - не рекомендуемое решение, но иногда единственное доступное, когда вы не контролируете код. 1003 *

0 голосов
/ 22 июля 2009

Вы можете загрузить QuickFix DLL в отдельный домен приложений. Это защитит ваше приложение от неожиданного завершения.

Вы можете проверить, завершает ли домен приложения основную программу, и при необходимости перезагрузить его.

Домен приложения

http://msdn.microsoft.com/en-us/library/system.appdomain.aspx

Немного больше информации о создании приложения с их использованием

http://msdn.microsoft.com/en-us/library/yk22e11a(VS.71).aspx

Я предполагаю, что у вас нет доступа к коду C ++, но. Круто .. что за мерзкая "штукатурка" починить.

...