C# Функция обратного вызова в dll третьей стороны правильно реализована? - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я использую стороннюю DLL для принтера. Это оболочка C# для C ++ DLL, поэтому ее можно использовать в приложении C#. Метод печати содержит функцию обратного вызова, которая должна вызываться после завершения печати. Однако я не могу заставить его работать, поэтому мне интересно, правильно ли я его реализую.

(сокращенный) метод этой функции печати и обратного вызова:

public class PrinterWrapper 
{
    public uint Print(CallbackFunction callbackFunction);

    public delegate void CallbackFunction();
}

В другом классе я использую функцию печати и пытаюсь проверить обратный вызов следующим образом:

class Foo {
    private void callback() {
    {
        Console.WriteLine("Test");
    }

    public void Print() {
    {
        PrinterWrapper wrapper = new PrinterWrapper();
        wrapper.Print(this.callback);
        wrapper.Print(new PrinterWrapper.CallbackFunction(this.callback));
    }
}

Я пробовал обе версии вызова метода Print (оба должны быть одинаковыми), но Я не получаю обратный звонок. Вместо этого я получаю APPCRA SH только тогда, когда печать готова. Произошел поиск, обнаружил, что я могу поймать исключение с параметром

<runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true" />
</runtime>

Это говорит мне, что это исключение защиты памяти чтения / записи. Журнал событий также показывает ошибку, прямо перед сбоем моего приложения:

Application: Application.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException

Таким образом, похоже, что сторонняя DLL пытается получить доступ к памяти, к которой у нее нет доступа. Документация говорит, что аргумент обратного вызова является указателем (это для оригинальной C ++ DLL). Документация по DLL-оболочке C# отсутствует.

Имея эту информацию, правильно ли я использовал функцию обратного вызова или мне нужно что-то изменить, чтобы она работала?

1 Ответ

0 голосов
/ 04 февраля 2020

Неправильная реализация делегата обратного вызова. Исправлено, и теперь оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...