PDA

View Full Version : [JAVA] Usare DLL C#


Napalm
28-04-2008, 15:50
Salve,
io ho un DLL scritta con c# ma devo usarla in java; fare il porting è un suicidio perché è molto complessa quindi ci metterei una vita non avendo la sicurezza che funziona al 100%.
Vorrei sapere se esiste un modo e quindi una guida che spiega l'uso delle DLL con java.
Grazie

NapalM

yorkeiser
28-04-2008, 16:04
Per richiamare una dll da Java puoi usare le Java Native Interface (googla per jni)

variabilepippo
28-04-2008, 16:09
Dovresti riuscire a farlo in diversi modi:


Creando un layer JNI unmanaged in C++
"Divertendoti" con la programmazione COM (cerca COM bridge e leggi Embedding .NET Controls in Java (http://www.codeproject.com/KB/COM/javanet.aspx))
Provando l'implementazione IKVM (http://www.ikvm.net/devguide/java2net.html)

tomminno
29-04-2008, 09:12
Per richiamare una dll da Java puoi usare le Java Native Interface (googla per jni)

Solo che una DLL C# è tutto fuorché Native

Napalm
29-04-2008, 11:49
Grazie delle risposte.

Mi sono documentato e mi pare di capire con JNI devo cmq scrivere una classe in java con i metodi che dovrei usare, il fatto è che fra variabili metodi e classi della DLL ci metterei na vita a scriverle.

Boh, ora il fatto è che se faccio questo client in C# non sò se posso usare i webservice del server java... ora è client/server java ed èok, il problema è che questi nuovi apparati che devo pilotare hanno solo librerie c# quindi sono panato :(

Napalm

tomminno
29-04-2008, 12:31
Boh, ora il fatto è che se faccio questo client in C# non sò se posso usare i webservice del server java... ora è client/server java ed èok, il problema è che questi nuovi apparati che devo pilotare hanno solo librerie c# quindi sono panato :(

Napalm

Potresti spiegare di che tipo di assembly si tratta e quali sono le funzionalità?

Perchè hai tirato in ballo i webservice e in questo caso potresti scrivere semplicemente un client C# che dialoghi con webservice Java o viceversa.

Napalm
29-04-2008, 13:05
Potresti spiegare di che tipo di assembly si tratta e quali sono le funzionalità?


In pratica sono classi che servono per la gestione di un hardware che permette la lettura di tag rfid. Abbiamo sempre usato classi native in java, il problema è che nuovi reader hanno solo classi in c# quindi non si possono "amalgamare" con le nostre in java.


Perchè hai tirato in ballo i webservice e in questo caso potresti scrivere semplicemente un client C# che dialoghi con webservice Java o viceversa.

In pratica il client è formato da un thread che legge i dati (quindi connessione all'hardware e lettura) e un thread che manda queste letture al server tramite webservices il tutto scritto in java.
La mia domanda da ignorante è appunto la possibilità di scrivere la parte client che si connette al webservices in c# anche se chi riceve o manda la richiesta è un server java.

NapalM

tomminno
29-04-2008, 15:27
In pratica sono classi che servono per la gestione di un hardware che permette la lettura di tag rfid. Abbiamo sempre usato classi native in java, il problema è che nuovi reader hanno solo classi in c# quindi non si possono "amalgamare" con le nostre in java.


Certo che sei fortunato ad avere un SDK per i tag rfid, gli hardware che ho usato io avevano un foglio dove erano spiegati (molto male) i comandi supportati :cry:


In pratica il client è formato da un thread che legge i dati (quindi connessione all'hardware e lettura) e un thread che manda queste letture al server tramite webservices il tutto scritto in java.
La mia domanda da ignorante è appunto la possibilità di scrivere la parte client che si connette al webservices in c# anche se chi riceve o manda la richiesta è un server java.

NapalM

In C# i webservice sono molto semplici, apri la soluzione e con il tasto desto sul progetto esegui un "Add Web Reference...", inserisci la url del webservice, ti scegli un namespace "umano", a questo punto hai già tutto quello che ti serve per richiamare comodamente il webservice.

Però i webservice sono strumenti "monodirezionali", il client non può ricevere qualcosa dal server se non la risposta ad una richiesta, dato che i messaggi SOAP transitano sopra l'HTTP.

Altrimenti ti serve una tradizionale connessione client-server, a quel punto sei te che conosci il protocollo di comunicazione con il server a dover implementare un client che parli la lingua corretta.
In ogni caso non c'è problema.

Napalm
29-04-2008, 15:56
Certo che sei fortunato ad avere un SDK per i tag rfid, gli hardware che ho usato io avevano un foglio dove erano spiegati (molto male) i comandi supportati :cry:


Materiale della FEIG se conosci, le librerie in java soffrono di qualche baco ma meglio di niente. Ho provato a partire dalla creazione della connessione seriale e poi a dare i comandi a mano ma non ci capisco nulla.


In C# i webservice sono molto semplici, apri la soluzione e con il tasto desto sul progetto esegui un "Add Web Reference...", inserisci la url del webservice, ti scegli un namespace "umano", a questo punto hai già tutto quello che ti serve per richiamare comodamente il webservice.

Però i webservice sono strumenti "monodirezionali", il client non può ricevere qualcosa dal server se non la risposta ad una richiesta, dato che i messaggi SOAP transitano sopra l'HTTP.

Altrimenti ti serve una tradizionale connessione client-server, a quel punto sei te che conosci il protocollo di comunicazione con il server a dover implementare un client che parli la lingua corretta.
In ogni caso non c'è problema.

proverò questa implementazione, il fatto che cmq mi devo scrivere del codice c# partendo dalla vecchia applicazione client java :(

Grazie cmq :)

NapalM

tomminno
29-04-2008, 16:36
Materiale della FEIG se conosci, le librerie in java soffrono di qualche baco ma meglio di niente. Ho provato a partire dalla creazione della connessione seriale e poi a dare i comandi a mano ma non ci capisco nulla.


Per quanto riguarda i comandi, sono tutti binari seguiti dal CRC, il problema sono le risposte, differenti da comando a comando, ognuna con la sua logica.


proverò questa implementazione, il fatto che cmq mi devo scrivere del codice c# partendo dalla vecchia applicazione client java :(

Grazie cmq :)

NapalM

Se hai davvero a che fare con i webservice non hai bisogno di partire dal client Java, se invece hai un semplice server (non webservice) allora si devi riscriverti tutta l'implementazione del protocollo di comunicazione che usavi prima.

Napalm
29-04-2008, 16:45
Per quanto riguarda i comandi, sono tutti binari seguiti dal CRC, il problema sono le risposte, differenti da comando a comando, ognuna con la sua logica.


boh, io ho provato a connettermi alla seriale tramite le rxtx però non ho neanche capito se la connessione è andata a buon fine o no.
Con un semplice relè su RS232, connettevo la seriale con rxtx.. aprivo un input e output stream, inviavo il comando con la output.write, avevo la sua risposta ed il gioco è fatto.
Penso che invece con i reader la questione sia più complessa, il fatto che oltre al comando in se (tipo :0x1201) bisogna dare anche i flag e vari altri dati.
Ho provato a vedere le classi c# per provare a riscriverle in java, ma sono molto complesse.


Se hai davvero a che fare con i webservice non hai bisogno di partire dal client Java, se invece hai un semplice server (non webservice) allora si devi riscriverti tutta l'implementazione del protocollo di comunicazione che usavi prima.

Mi hai frainteso, è che devo "copiare" il client in java per portarlo in c#... è quella la lunghezza del lavoro.

NapalM

Napalm
26-05-2008, 11:08
In C# i webservice sono molto semplici, apri la soluzione e con il tasto desto sul progetto esegui un "Add Web Reference...", inserisci la url del webservice, ti scegli un namespace "umano", a questo punto hai già tutto quello che ti serve per richiamare comodamente il webservice.

Però i webservice sono strumenti "monodirezionali", il client non può ricevere qualcosa dal server se non la risposta ad una richiesta, dato che i messaggi SOAP transitano sopra l'HTTP.



L'ho fatto, ho aggiunto il riferimento web, ho visto i files che mi ha generato.
A questo punto istanzio la classe creata, chiamo il metodo ma mi ritorna questo errore:
"richiesta non riuscita con codice stato HTTP 405: metodo non consentito".
mentre chiamandolo in java funziona.
Che problema può essere?

NapalM

Napalm
26-05-2008, 11:26
Bah, che errore da cane! Il files .cs generato avevo un riferimento web errato per cui mi dava quell'errore...:muro:

NapalM