ho guardando molte discussioni circa l'eccezione "non può passare un GCHandle attraverso AppDomain" ma io ancora non capisco ....GCHandle, AppDomain codice gestito e 3 ° dll parti
sto lavorando con un lettore RFID guidato da una DLL. Non ho codice sorgente per questa DLL ma solo un esempio per mostrare come usarlo.
L'esempio funziona benissimo ma devo copiare del codice in un altro progetto per aggiungere il lettore al middleware Microsoft Biztalk.
Il problema è che il processo di Microsoft Biztalk funziona in un altro AppDomain. Il lettore gestisce gli eventi quando viene letto un tag. Ma quando lo eseguo sotto Microsoft Biztalk ho ottenuto questa fastidiosa eccezione.
Non riesco a vedere alcuna soluzione su come farlo funzionare ...
Ecco alcuni codice che potrebbe essere interessante:
// Let's connecting the result handlers.
// The reader calls a command-specific result handler if a command is done and the answer is ready to send.
// So let's tell the reader which functions should be called if a result is ready to send.
// result handler for reading EPCs synchronous
Reader.KSRWSetResultHandlerSyncGetEPCs(ResultHandlerSyncGetEPCs);
[...]
var readerErrorCode = Reader.KSRWSyncGetEPCs();
if (readerErrorCode == tKSRWReaderErrorCode.KSRW_REC_NoError)
{
// No error occurs while sending the command to the reader. Let's wait until the result handler was called.
if (ResultHandlerEvent.WaitOne(TimeSpan.FromSeconds(10)))
{
// The reader's work is done and the result handler was called. Let's check the result flag to make sure everything is ok.
if (_readerResultFlag == tKSRWResultFlag.KSRW_RF_NoError)
{
// The command was successfully processed by the reader.
// We'll display the result in the result handler.
}
else
{
// The command can't be proccessed by the reader. To know why check the result flag.
logger.error("Command \"KSRWSyncGetEPCs\" returns with error {0}", _readerResultFlag);
}
}
else
{
// We're getting no answer from the reader within 10 seconds.
logger.error("Command \"KSRWSyncGetEPCs\" timed out");
}
}
[...]
private static void ResultHandlerSyncGetEPCs(object sender, tKSRWResultFlag resultFlag, tKSRWExtendedResultFlag extendedResultFlag, tKSRWEPCListEntry[] epcList)
{
if (Reader == sender)
{
// Let's store the result flag in a global variable to get access from everywhere.
_readerResultFlag = resultFlag;
// Display all available epcs in the antenna field.
Console.ForegroundColor = ConsoleColor.White;
foreach (var resultListEntry in epcList)
{
handleTagEvent(resultListEntry);
}
// Let's set the event so that the calling process knows the command was processed by reader and the result is ready to get processed.
ResultHandlerEvent.Set();
}
}
Innanzitutto grazie per la risposta.In realtà, riesco a instanziare un oggetto dalla DLL e usarlo. Come puoi vedere nel codice qui sopra, collego un metodo (ResultHandlerSyncGetEPCs) all'evento che il lettore invia quando legge i tag. Il codice sorgente si blocca sulla linea che è in attesa di un evento ... Non attende almeno 10 secondi per un timeout, lancia immediatamente l'eccezione "impossibile passare GCHandle ...". – hurtauda
E posso vedere che il lettore è ben collegato e può ricevere il metodo 'Reader.KSRWSyncGetEPCs();' perché sta leggendo i tag sull'antenna in questo momento. – hurtauda
Ho dato una raccomandazione specifica per diagnosticare la fonte del problema. Se non si desidera eseguire questa operazione, contattare direttamente il fornitore per ricevere assistenza. –