Можем ли мы поставить функцию обратного вызова внутри DLL?
-
09-10-2019 - |
Вопрос
Я пытаюсь использовать методы .NET Serialport из другой программы, которая использует Enity3D Engine.
У меня библиотека класса AC # Class (DLL), которая регистрирует и реализует функцию обратного вызова, когда последовательный порт получает некоторые данные.
public CSerialDll()
{
_serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived);
}
void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytes = _serial.BytesToRead;
_comBuffer = new byte[bytes];
_serial.Read(_comBuffer, 0, bytes);
Console.WriteLine("data recv: " + System.Text.ASCIIEncoding.ASCII.GetString(_comBuffer));
}
А потом в моей другой программе я создаю экземпляр класса.
Я хочу знать, будет ли мой перезапись Serial_DatareCeived внутри библиотеки (DLL), будет называться или нет. Я пытаюсь прочитать _Combuffer внутри библиотеки из другой программы, и она всегда пуста (даже если данные приходят при тестировании приложении консоли внутри одного приложения).
Любая помощь значительно ценится.
Спасибо
Решение
<HUNCH>
Если бы я был дизайнером класса, я бы поставил данные обратным вызова, поэтому, если вы посмотрите на SerialDataReceivedEventArgs
Класс, вы увидите, что внутри это вы буфер с данными.
Итак, после того, как вы получите событие, и вы тогда вызовите прочитанные, вы фактически отказываетесь от данных, которые отправляются вам и запросите больше.
Другими словами, да, тот факт, что это внешняя библиотека, не имеет ничего общего с тем, что он не работает, как следует.
</HUNCH>
Другие советы
Как правило, нет ничего особенного в отношении методов, находящихся в отдельной DLL, до тех пор, пока модификаторы доступа устанавливаются правильно.
Однако в зависимости от того, как вы настроили ваше решение, это может быть боль, чтобы у вас была последняя DLL в вашей папке Bin.