В настоящее время я использую стороннюю 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# отсутствует.
Имея эту информацию, правильно ли я использовал функцию обратного вызова или мне нужно что-то изменить, чтобы она работала?