Hoy hice una pequeña prueba para mi proyecto: el objetivo: implementar archivos .jar en un proyecto de C# como .dll . Mi archivo .java / .jar actual tiene el siguiente aspecto.
package ws; public class Adding { public int Add(int a, int b) { return a + b; } } Convertí con éxito lo anterior en un .dll con IKVM (Versión: 7.5.0.2).
Ahora quiero hacer referencia a este .dll en mi proyecto C# y llamar al método Add(int a, int b) . Ya agregué la referencia así:
De todos modos, no puedo llamar al método porque el compilador no puede encontrar la referencia .dll .
using Adding; // <= Compiler Error CS0246 (Can't find the reference) Console.WriteLine(Add(1, 2));¿Alguien sabe cómo podría lograr esto? Agradezco mucho cualquier tipo de ayuda, saludos!
He descompilado el .dll , como se exige en los comentarios, con ILSpy (Versión: ILSpy 7.2), lo que da como resultado el siguiente resultado.
// C:\Users\maikh\Desktop\Adding.dll // Adding, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // Global type: <Module> // Architecture: AnyCPU (64-bit preferred) // Runtime: v4.0.30319 // Hash algorithm: SHA1 using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using IKVM.Attributes; [assembly: Debuggable(true, false)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: SourceFile(null)] [module: JavaModule(Jars = new string[] { "Adding.jar" })] [module: PackageList(new string[] { })] También encontré algunas referencias, mientras descompilaba el .dll . No sé si es importante mencionar esto, pero lo proporcionaré de todos modos.
// Detected TargetFramework-Id: .NETFramework,Version=v4.0 // Detected RuntimePack: Microsoft.NETCore.App // Referenced assemblies (in metadata order): // IKVM.Runtime, Version=7.5.0.2, Culture=neutral, PublicKeyToken=00d957d768bec828 // Assembly reference loading information: // There were some problems during assembly reference load, see below for more information! // Error: Could not find reference: IKVM.Runtime, Version=7.5.0.2, Culture=neutral, PublicKeyToken=00d957d768bec828 // mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 // Assembly reference loading information: // Info: Success - Found in Assembly List // Assembly load log including transitive references: // IKVM.Runtime, Version=7.5.0.2, Culture=neutral, PublicKeyToken=00d957d768bec828 // Error: Could not find reference: IKVM.Runtime, Version=7.5.0.2, Culture=neutral, PublicKeyToken=00d957d768bec828 // mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 // Info: Success - Found in Assembly List Logré agregar la referencia faltante IKVM.Runtime . Sin embargo, no puedo encontrar ninguna información sobre el espacio de nombres, la clase o el método.
Dado que su clase Java está en el paquete ws , debería using ws en su código C#:
using ws; Adding adding = new Adding(); Console.WriteLine(adding.Add(1, 2)); Y si desea llamar al método Add de forma estática, declárelo static en Java:
package ws; public class Adding { public static int Add(int a, int b) { return a + b; } } using ws; Console.WriteLine(Adding.Add(1, 2));En primer lugar, está utilizando una clase como espacio de nombres y probablemente no sea correcto. Su llamada de método probablemente debería verse así:
var adder = new Adding(); Console.WriteLine(adder.Add(1, 2));Si eso no funciona, inspeccionaría el dll producido para verificar que sea un .net dll conforme. Eso también debería mostrar los espacios de nombres, los nombres de las clases y otra información. Un descompilador como dotPeek o ilSpy puede mostrar la misma información en un formato que puede ser más fácil de leer.