Ich habe schon in vielen Threads über die Ausnahme suchen „kann nicht eine GCHandle über AppDomains passieren“, aber ich es noch nicht bekommen ....GCHandle gelang AppDomains Code und 3rd-Party-DLL
Ich arbeite mit ein RFID-Reader, der von einer DLL angesteuert wird. Ich habe keinen Quellcode für diese DLL, aber nur ein Beispiel, um zu zeigen, wie man es benutzt.
Das Beispiel funktioniert gut, aber ich muss Code in einem anderen Projekt kopieren, um den Reader der Middleware Microsoft Biztalk hinzuzufügen.
Das Problem ist, dass der Prozess von Microsoft BizTalk in einer anderen AppDomain funktioniert. Der Leser behandelt Ereignisse, wenn ein Tag gelesen wird. Aber wenn ich es unter Microsoft Biztalk starte, habe ich diese lästige Ausnahme.
Ich kann keine Lösung sehen, wie es ...
Hier arbeiten lassen ist ein Code, die interessant sein können:
// 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();
}
}
Zuerst danke für Ihre Antwort.Tatsächlich gelingt es mir, ein Objekt von der DLL zu instanziieren und zu verwenden. Wie Sie im obigen Code sehen können, schließe ich eine Methode (ResultHandlerSyncGetEPCs) an das Ereignis an, das der Leser sendet, wenn er Tags liest. Der Quellcode stürzt bei der Zeile ab, die auf ein Ereignis wartet ... Es wartet nicht mindestens 10 Sekunden auf ein Timeout, es löst sofort die Ausnahme "Kann GCHandle nicht übergeben ..." aus. – hurtauda
Und ich kann sehen, dass der Leser gut verbunden ist und die Methode 'Reader.KSRWSyncGetEPCs();' empfangen kann, weil es Tags auf der Antenne in diesem Moment liest. – hurtauda
Ich gab eine spezifische Empfehlung, um die Ursache des Problems zu diagnostizieren. Wenn Sie dies nicht weiterverfolgen möchten, wenden Sie sich direkt an den Anbieter. –