Domanda

Nel mio finestre app, sto usando una DLL c ++ avvolto con una DLL NET (in particolare - il motore quickfix). Durante l'esecuzione, una volta al giorno (non in qualsiasi momento specifico), in una delle zone un costruttore di una delle classi incorporate getta un errore di runtime. Anche se l'errore viene catturato e riportato (in un file di registro e il database), ancora ottengo 'errore di runtime' le finestre di dialogo (che offre senza possibilità di recupero / debug) e dopo aver premuto il pulsante 'OK' (l'unico disponibili) la mia app è terminato.

Questo accade durante l'esecuzione in debug, di uscita e anche durante l'esecuzione all'interno del debugger VS2005 stesso.

Come un lato nota, ho compilato le DLL di cui sopra a livello locale (dal momento che almeno uno di essi include codice generato automaticamente in base a una specifica XML).

Chiunque? (Dettagli seguono)

Il mio codice:

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
}

Dettagli errore: Messaggio: componente esterno ha generato un'eccezione Analisi dello stack:

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)
È stato utile?

Soluzione

Si potrebbe caricare la DLL QuickFix in un AppDomain separato. Che proteggerebbe la vostra applicazione da esso che chiude in modo imprevisto.

Si potrebbe provare per la terminazione dominio applicazione dal programma principale e ricaricarla quando necessario.

dominio App

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

Un po 'più informazioni sulla costruzione di un app che li utilizzano

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

Sto assumendo che non si ha accesso al codice C ++, ma. Ick .. che brutta fix "intonaco".

Altri suggerimenti

Sembra che tu abbia una traccia dello stack che punta a un bug all'interno della DLL.
Hai il suo codice? E 'sostenuto da qualcuno che può inoltrare l'analisi dello stack per?

Senza fissa la DLL in sé, il problema continuerà a verificarsi, a meno che non si identificano le cause nel codice che causano l'incidente e il lavoro intorno a loro -. Non una soluzione consigliata, ma a volte l'unico disponibile quando non si controlla il codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top