Avatar billede repsak Nybegynder
12. marts 2003 - 15:36 Der er 22 kommentarer og
1 løsning

C# dll i java

Jeg har skrevet en dll i C#. Hvordan bruger jeg dennes metoder fra Java?
Test.dll som indeholder en metode int get()
class Testing{
    static{
        System.loadLibrary ("Test");
    }
    public static native int get();
}
...? (dette virker ikke
Avatar billede arne_v Ekspert
12. marts 2003 - 15:45 #1
Kan du være lidt mere præcis med hvordan det ikke virker ?
Avatar billede arne_v Ekspert
12. marts 2003 - 15:47 #2
Jeg har iøvrigt aldrig hørt om Java -> C#.

Java kan kun kalde "klassiske Win32 DLL'er".

Jeg er ikke sikker på at en C# DLL er en sådan. Den indeholder vel IL !?
Avatar billede repsak Nybegynder
12. marts 2003 - 15:48 #3
Jeps :-)
Dette er min javadel:
class TestDll{
    public static void main(String args[]){
        System.out.println(Testing.get());
    }
}

class Testing{
    static{
        System.loadLibrary ("Test");
    }
    public static native int get();
}

min dll ligger i samme mappe.
Når jeg så kører programmet får jeg en Java.lang.UnsatisfiedLinkerror: get
Avatar billede repsak Nybegynder
12. marts 2003 - 15:49 #4
Jeg har heller ikke hørt om det, men troede at det kunne lade sig gøre :)
Avatar billede arne_v Ekspert
12. marts 2003 - 15:54 #5
Hvad har du skrevet i din C# kode ?

For C så får man jo genereret nogle funktion signaturer
(som er meget anderledes end det intuitive !).
Avatar billede arne_v Ekspert
12. marts 2003 - 15:56 #6
Der er et eksempel på:
  http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html

for C, hvor man kan se at:

native byte[] loadFile(String name);

bliver til:

JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
  (JNIEnv * env, jobject jobj, jstring name)
Avatar billede repsak Nybegynder
12. marts 2003 - 15:56 #7
namespace Test{
  public class Hej{
    public Hej(){
    System.Console.WriteLine("in constr");
    }

 
      public static int get(){
          System.Console.WriteLine("in dll");
        return 50;
      }
  }
}
Avatar billede arne_v Ekspert
12. marts 2003 - 15:57 #8
En "normal" erklræing af:
  int get()
i C# vil næppe virke.

Og jeg tvivler som sagt på at det overhovedet kan lade sig gøre.
Avatar billede arne_v Ekspert
12. marts 2003 - 15:58 #9
Jep.

Hvis du sammenligner din C# kode med det som javah genererer, så
er det ret indlysende at Java ikke kan finde get metoden.
Avatar billede repsak Nybegynder
12. marts 2003 - 16:02 #10
Kan jeg konkludere at det ikke er muligt? :-)
Avatar billede arne_v Ekspert
12. marts 2003 - 16:13 #11
Ikke endegyldigt.

Du kan godt konkludere at public static int get() i C# ikke virker.

Du skal nok have fat i nogle C# hajer og spørge dem om man kan lave
det jeg kalder en "klassisk Win32 DLL" i C#.

Hvis man kan det så skal du igang med at få metode signaturen rigtig
og få defineret det ekvivalente til jni.h for C#.

Jeg ville opgive ideen - masser af arbejde med minimal udsigt
til success !
Avatar billede repsak Nybegynder
12. marts 2003 - 16:21 #12
Ok, men min idé var at jeg har en package som er skrevet i java som indeholder 128 hjemmelavede metoder. Det kunne så være nice hvis jeg kunne bruge disse metoder/algoritmer i både java og C#... Hvad med point? Fik ikke løst mit problem, men fik en masse svar ...? Hvad er etikken på eksperten?
Avatar billede arne_v Ekspert
12. marts 2003 - 16:27 #13
Det er helt op til dig om du vil give point.

Der gives normalt point for "Det er ikke muligt, fordi ..." svar.

Men mit svar var jo mere "Jeg tror ikke at det er muligt, fordi ...",
så det er op til dig.
Avatar billede arne_v Ekspert
12. marts 2003 - 16:28 #14
Jeg ville nok tage Java source og oversætte den med J# og bruge
det fra C# (C# -> J# bør være helt uproblematisk og J# og Java
skulel være 99% source kompatible).
Avatar billede arne_v Ekspert
12. marts 2003 - 16:29 #15
J# ideen baserer sig selvfølgelig meget på at det er rimeligt
self contained algoritmer som ikek kræver diverse eksterne
packages, som muligvis ikek er i J#.
Avatar billede arne_v Ekspert
12. marts 2003 - 16:30 #16
Og et svar hvis du vil give nogle point.
Avatar billede guidmaster Nybegynder
12. marts 2003 - 16:45 #17
Jeg ved ikke om du har kigget på Regasm.exe som følger med .NET frameworket? Dette værktøj gør det muligt at snakke med .NET assemblies.....og kan man ikke fra Java snakke med COM komponenter ???

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cptools/html/cpgrfassemblyregistrationtoolregasmexe.asp
Avatar billede magoo20000 Nybegynder
12. marts 2003 - 16:51 #18
Du kan da lave din C# kode som en webservice og så kalde den fra java. Proxyen stiller en række metoder til rådighed gennem http port 80.
Avatar billede arne_v Ekspert
12. marts 2003 - 17:02 #19
Det er en udmærket metode til Java-.NET interoperability.

Men den er server orienteret. Uanset om det er .NET->Java
eller Java->.NET så skal der køre en server.

Ikke noget problem i mange sammenhænge.

Men ikke praktisk i andre sammenhænge.
Avatar billede pollewop Nybegynder
12. marts 2003 - 17:12 #20
Jeg har ikke arbejdet med c# endnu, men som jeg forstår det, kan man uden problemer kommunikere mellem C++ <> C# <> VB.
Så hvorfor ikke lave en dll i C som en link mellem Java og din C# dll ?
Avatar billede viciodk Praktikant
12. marts 2003 - 17:18 #21
pollewop -> Du tænker da vist på at man kan kommunikere mellem C++.NET, C# og VB.NET eller hvad?
Avatar billede pollewop Nybegynder
12. marts 2003 - 17:58 #22
mmmm.... Der fik du mig viciodk, men siden Java, der kører på en VM, kan kommunikere med det underliggende platform, vil det være utænkeligt hvis MS produkterne ikke kunne snakke sammen, selvom de også kører på en VM.
Avatar billede arne_v Ekspert
12. marts 2003 - 18:00 #23
Der er næppe problemer med:
  .NET -> gammeldags Win32
men det er jo:
  gammeldags Win32 -> .NET
vi skal bruge.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester