6

「AppDomains 間で GCHandle を渡すことはできません」という例外について多くのスレッドを見てきましたが、まだ取得できません....

DLL によって駆動される RFID リーダーを使用しています。この DLL のソース コードはありませんが、使用方法を示すサンプルのみがあります。

サンプルはうまく機能しますが、リーダーをミドルウェアの Microsoft Biztalk に追加するには、別のプロジェクトのコードをいくつかコピーする必要があります。

問題は、Microsoft Biztalk のプロセスが別の AppDomain で動作することです。リーダーは、タグが読み取られたときにイベントを処理します。しかし、Microsoft Biztalk で実行すると、この迷惑な例外が発生しました。

それを機能させる方法についての解決策がわかりません...

興味深いかもしれないいくつかのコードを次に示します。

// 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();
    }
}
4

1 に答える 1