Domanda

Sono per la maggior parte incorporato con successo firefox / xulrunner nella nostra applicazione c #, ma non è senza problemi. Una volta in un grande mentre un AccessViolationException sarà gettato che credo è causato dal GC spostamento di un oggetto gestito in memoria ei tentativi XPCOM non gestiti da utilizzare dopo che è stato spostato. Per esempio ho creato un gestore di protocollo per un protocollo personalizzato che implementa alcune interfacce che Firefox / XULRunner invita i. Dopo aver fatto ciò, l'AccessViolationException del diventato molto più predominante. Ho guardato in GCHandle.Alloc (oggetto, GCHandleType.Pinned) come una possibile soluzione, ma non ho trovato abbastanza informazioni su come scrivere un marshaller personalizzato per rendere la mia classe che ha implementato l'interfaccia "copiabili". Così qualcuno ha qualche idea su come affrontare questo problema o il modo di tradurre la mia classe in uno "copiabili"? Anche la sua quasi impossibile rintracciare quali parti del Interop stanno causando l'AccessViolationException. Ugh: - (

Grazie per qualsiasi comprensione!

È stato utile?

Soluzione

Credo di avere una risposta a questa attraverso i mezzi di un'altra domanda ho chiesto "fa GetComInterfaceForObject pin l'oggetto? ". Fondamentalmente quello che credo sia l'AccessViolationExceptions dove essere generati da un oggetto andando fuori del campo di applicazione nel lato .net, se la mia comprensione è corretta il riferimento non gestito non tenere in vita un oggetto gestito. Quindi, qualsiasi oggetto gestito che creo che ha bisogno di essere in giro per un lungo periodo di tempo in modo che il codice non gestito può chiamare su di essa, è ora memorizzato sia in un campo o un elenco. Anche sul lato di un oggetto "copiabili", non ho trovato un modo per bloccare una classe, ma sono riuscito a capire come pin una struct che implementato un'interfaccia. L'interfaccia è un'interfaccia interoperabilità che aveva attributi MarshalAs definiti, che ha permesso la conversione di codice non gestito, quindi apparentemente permettendo l'oggetto da bloccato. Non sono sicuro se questo è possibile con un'implementazione della classe, come ho ancora ricevuto gli errori anche se è stato implementato nello stesso modo esatto come struct.

: -)

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