2010-12-06 25 views
0

J'essaie d'utiliser des méthodes de port série .Net d'un autre programme qui utilise le moteur Unity3D.Pouvons-nous mettre la fonction de rappel à l'intérieur dll?

J'ai une bibliothèque de classe C# (dll) qui enregistre et implémente une fonction de rappel lorsque le port série reçoit des données.

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)); 
} 

Ensuite, dans mon autre programme, je crée une instance de la classe.

Je veux savoir si mon rappel serial_DataReceived à l'intérieur de la bibliothèque (dll) sera appelé ou non. J'essaie de lire _comBuffer à l'intérieur de la bibliothèque à partir d'un autre programme et il est toujours vide (même si les données viennent quand j'ai testé avec une application de console dans la même application).

Toute aide est grandement appréciée.

Merci

Répondre

0

<HUNCH>

Si j'étais un concepteur de classe, je mettrais les données dans la fonction de rappel, donc si vous regardez la classe SerialDataReceivedEventArgs, vous verrez que l'intérieur est vous tampon avec les données. Donc, après avoir reçu un événement, et que vous appelez ensuite read, vous rejetez les données qui vous sont envoyées et vous en demandez plus. En d'autres termes, oui, le fait qu'il s'agisse d'une bibliothèque externe n'a rien à voir avec le fait qu'il ne fonctionne pas comme il le devrait.

</HUNCH>

+0

C'est ainsi que j'ai écrit ma propre bibliothèque de ports série, mais d'après l'apparence, astk utilise la bibliothèque 'Serial.IO.Ports' de Microsoft qui vous oblige à lire les données après l'événement, pas attaché à l'événement. Il y a beaucoup de choses mal faites dans la classe Microsoft SerialPort. –

0

Il y a généralement rien de particulièrement spécial sur les méthodes étant dans une DLL séparée, tant que modificateurs d'accès sont correctement définis. Toutefois, en fonction de la configuration de votre solution, il peut être difficile de vous assurer que vous disposez de la dernière DLL dans votre dossier bin.

+0

Ça devrait marcher. Mais le problème est que non. Dans mon client qui utilise cette DLL, je crée une nouvelle instance de cette DLL. Ainsi, la DLL enregistrera le rappel. Comme vous pouvez le voir dans mon code ci-dessus, ce rappel remplit _comBuffer qui a une propriété à lire depuis des programmes extérieurs. Et puis dans ma boucle de mise à jour de mon programme client, j'ai essayé de lire cette propriété. Cette propriété est toujours vide. Mais quand je fais le projet dll comme un projet d'application console et écrit une méthode principale pour tester le code, je peux recevoir les données de série. Des idées? Merci ... – astk

+0

@astk Alors quand vous parcourez le code quelles sont vos observations. Aussi, il vaut la peine de mentionner que, simplement parce que le code est dans une DLL distincte ne signifie pas que vous ne pouvez pas passer à travers. –

+0

Salut ... comment passer à travers? J'utilise Unity3D en tant que client qui utilise cette DLL. Je pourrais passer à travers mon script d'unité. Mais pas au niveau de la source dll. Merci ... – astk