Pergunta

Dentro do meu aplicativo Windows, eu estou usando um c ++ DLL envolvido com um .NET DLLs (especificamente - o motor quickfix). Durante a execução, uma vez por dia (não em qualquer momento específico), em um dos um construtor de uma das classes built-in gera um erro de tempo de execução. Mesmo que o erro é pego e relatada (em um arquivo de log e banco de dados), eu ainda obter 'erro de execução' as janelas de diálogo (que oferece nenhuma recuperação / depuração opções) e após pressionar o botão 'OK' (o único disponível) meu aplicativo é encerrado.

Isso acontece quando executado em Debug, lançamento e até mesmo durante a execução dentro do VS2005 depurador em si.

Como uma nota lateral, eu compilei os acima mencionados DLLs localmente (uma vez que pelo menos um deles inclui código gerado automaticamente com base em uma especificação XML).

Anyone? (Detalhes a seguir)

Meu código:

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
}

Detalhes do erro: Mensagem: componente externo acionou uma exceção rastreamento de pilha:

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)
Foi útil?

Solução

Você poderia carregar o QuickFix DLL em um AppDomain separado. Que proteja a sua aplicação a partir dele terminar inesperadamente.

Você pode testar para a terminação de domínio aplicação do seu programa principal e recarregá-lo quando necessário.

domínio App

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

Um pouco mais informação sobre a construção de um aplicativo de usá-los

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

Eu estou supondo que você não tem acesso ao código C ++, mas. Ick .. o que um desagradável "gesso" correção.

Outras dicas

Parece que você tem um rastreamento de pilha apontando para um bug dentro da DLL.
Você tem o seu código? É suportado por alguém que você pode encaminhar o rastreamento de pilha para?

Sem fixar a própria DLL, a questão vai continuar a ocorrer, a menos que você identificar os casos em seu código que causa o acidente e trabalhar em torno deles - não uma solução recomendada, mas em algum momento o único disponível quando você não controlar o código <. / p>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top