Acesso a dll em csharp com java

Estou tentando acessar uma dll feita em csharp, através do java. Para isso eu já tentei utilizar duas bibliotecas java que deveriam fazer tal interface do java com as funções da dll.

A primeira pergunta é: É possível acessar dlls csharp do java?! Todas as minhas tentativas foram em torno das bibliotecas JNative e NLink.

A segunda pergunta é: minha dll em csharp é composta por classes, e quero instância-las e acessar seus métodos, seria isso possível?!

Existe alguma configuração adicional para a utilização de tais bibliotecas, visto que estamos utilizando java 6?

desde já agradeço!!

Você não pode acessar DLLs .NET desse jeito; você precisa usar algo como http://www.jnbridge.com/ ou o http://j-integra.intrinsyc.com/.

Dependendo de como você quer fazer as coisas, você pode fazer ao contrário - usar o IKVM.NET - http://www.ikvm.net/

De acordo com o que o colega acima descreveu, prepare-se para “muito choro e ranger de dentes…” by thingol

Alias dos três o mais simples que eu achei é o jnbridge mas ele é pago… O ikvm pelamordedeus é muito enrolado, mas é free…

Vou explicar um pouco a teoria de DLLs.

Uma DLL é algo que pode ser carregado pelo seu programa, ou então por um serviço chamado “DCOM”. No primeiro caso, há três maneiras de seu programa acessar a DLL:
a) Pelo método antigo, compatível com muitas linguagens, e que pode ser usado com JNA ou então com um dos pacotes que você mencionou. A DLL provavelmente pode ter sido escrita em C, ou Fortran, ou alguma linguagem antiga.
b) Via COM - Esse é o método que é compatível principalmente com VB, VBA, ASP, VBScript etc. - você precisa do pacote JACOB se quiser acessar tais DLLs em Java. Essas DLLs precisam ser “registradas”. Ela pode ter sido escrita em C, C++, Delphi ou VB 6.0.
c) Via .NET - Se a DLL foi escrita em alguma das linguagens .NET (C#, VB.NET, J#, F#, Delphi.NET etc.) é meio complicado chamar a tal DLL a partir do Java. Você precisa de um pacote pago, como o http://www.jnbridge.com/ ou o http://j-integra.intrinsyc.com/ . Esses pacotes fazem uma pequena mágica, que basicamente é chamar as DLLs .NET mais ou menos como se elas fossem classes RMI (você já ouviu falar de RMI, não)? Ou seja, há uma certa perda de desempenho devido ao fato que é necessário sempre fazer um “acesso remoto” ao código .NET.

Se quiser algo realmente nojento, e a interface dos métodos C# não envolve passagem de objetos (só tipos primitivos e strings), você poderia registrar as DLLs .NET como se fossem DLLs COM. Isso não funciona muito bem, e é bom testar antes (usando VBScript) para ver se elas estão funcionando do jeito que você quer. Então você usa o JACOB para poder acessar as tais DLLs como se elas fossem DLLs COM. Prepare-se para ter bastante dor de cabeça.

[quote=entanglement]Vou explicar um pouco a teoria de DLLs.

Uma DLL é algo que pode ser carregado pelo seu programa, ou então por um serviço chamado “DCOM”. No primeiro caso, há três maneiras de seu programa acessar a DLL:
a) Pelo método antigo, compatível com muitas linguagens, e que pode ser usado com JNA ou então com um dos pacotes que você mencionou. A DLL provavelmente pode ter sido escrita em C, ou Fortran, ou alguma linguagem antiga.
b) Via COM - Esse é o método que é compatível principalmente com VB, VBA, ASP, VBScript etc. - você precisa do pacote JACOB se quiser acessar tais DLLs em Java. Essas DLLs precisam ser “registradas”. Ela pode ter sido escrita em C, C++, Delphi ou VB 6.0.
c) Via .NET - Se a DLL foi escrita em alguma das linguagens .NET (C#, VB.NET, J#, F#, Delphi.NET etc.) é meio complicado chamar a tal DLL a partir do Java. Você precisa de um pacote pago, como o http://www.jnbridge.com/ ou o http://j-integra.intrinsyc.com/ . Esses pacotes fazem uma pequena mágica, que basicamente é chamar as DLLs .NET mais ou menos como se elas fossem classes RMI (você já ouviu falar de RMI, não)? Ou seja, há uma certa perda de desempenho devido ao fato que é necessário sempre fazer um “acesso remoto” ao código .NET.
[/quote]

A perda é grande, para falar a verdade. O que acontece é que você vai criar uma dll que acessa .net, em c e fazer jni nela, assim criando outra lib.
vai virar uma bagunça que não tem fim. É preferível reescrever código.

[quote=juliocbq]
A perda é grande, para falar a verdade. O que acontece é que você vai criar uma dll que acessa .net, em c e fazer jni nela, assim criando outra lib.
vai virar uma bagunça que não tem fim. É preferível reescrever código.[/quote]

É fácil dizer isso :frowning:

De qualquer maneira, eu estava com um problema de converter um código Java em outro .NET; acho que vou usar o IKVM.NET para evitar muita reescrita de código. (São 24216 linhas de código, mas isso dá um belo trabalho, já que muitas coisas no Java não são diretamente traduzíveis para o .NET).

[quote=entanglement][quote=juliocbq]
A perda é grande, para falar a verdade. O que acontece é que você vai criar uma dll que acessa .net, em c e fazer jni nela, assim criando outra lib.
vai virar uma bagunça que não tem fim. É preferível reescrever código.[/quote]

É fácil dizer isso :frowning:

De qualquer maneira, eu estava com um problema de converter um código Java em outro .NET; acho que vou usar o IKVM.NET para evitar muita reescrita de código. (São 24216 linhas de código, mas isso dá um belo trabalho, já que muitas coisas no Java não são diretamente traduzíveis para o .NET).[/quote]

Ikvm roda muito bem. Até o eclipse roda de boa nela.

[quote=entanglement][quote=juliocbq]
A perda é grande, para falar a verdade. O que acontece é que você vai criar uma dll que acessa .net, em c e fazer jni nela, assim criando outra lib.
vai virar uma bagunça que não tem fim. É preferível reescrever código.[/quote]

É fácil dizer isso :frowning:

De qualquer maneira, eu estava com um problema de converter um código Java em outro .NET; acho que vou usar o IKVM.NET para evitar muita reescrita de código. (São 24216 linhas de código, mas isso dá um belo trabalho, já que muitas coisas no Java não são diretamente traduzíveis para o .NET).[/quote]

A dll tem mais de 24.000 linhas?

Não; são 253 arquivos .java, com o total de 24216 linhas de código. Tentei usar o “Java Language Conversion Assistant” mas como o código é meio misturado Java 1.4 e Java 5.0, e o JLCA só entende direito Java 1.3 ou anterior, então não fui bem sucedido.

Não estou entendendo o que tem haver seu programa ter 24.000 com a dll. Para acessar a lib c#, você tem que fazer um mapeamento com uma dll nativa em c++. Depois fazer um mapeamento java na lib c nativa. Por isso disse que é preferível codificar novamente(As funções da dll c#).

A dll é usada para fazer o que?

Ah, é que eu tenho o problema inverso (tenho um código Java e quero usá-lo em uma aplicação .NET).

Com J# não roda esse código escrito em Java?

Com J# não roda esse código escrito em Java?[/quote]

Se você tiver os fontes pode até compilar. Mas se for assembly bytecode, não pode fazer ele rodar em uma vm que entende IL. Mas pode usar a ikvm.

Com J# não roda esse código escrito em Java?[/quote]

O J# é uma implementação meia-boca do Java 1.1, com algumas classes do Java Collections Framework ( pacote java.util ).
Ele nem implementa o Java 1.1 da Microsoft (que tinha umas classes com.ms.wfc.algumacoisa). Nem o pacote Swing adaptado para Java 1.1 (existe tal coisa, é questão de procurar) funciona com o J#.
Como o código é Java 5.0 (usa generics) não posso simplesmente pegar o fonte Java e tentar recompilá-lo com o J#.