如何在 C# .NET Core 6 中使用 Java .dll?
How to use a Java .dll in C# .NET Core 6?
初始情况
我今天对我的项目进行了一些测试 - 目标:将 .jar
文件作为 .dll
实施到 C#
项目中。我当前的 .java
/ .jar
文件如下所示。
package ws;
public class Adding
{
public int Add(int a, int b)
{
return a + b;
}
}
我成功地将上面的内容转换成了 .dll
with IKVM (Version: 7.5.0.2).
我现在想在我的 C#
项目中引用这个 .dll
并调用 Add(int a, int b)
方法。我已经像这样添加了参考:
无论如何我无法调用该方法,因为编译器找不到 .dll
引用..
using Adding; // <= Compiler Error CS0246 (Can't find the reference)
Console.WriteLine(Add(1, 2));
有人知道我怎样才能做到这一点吗?我非常感谢任何形式的帮助,干杯!
编辑 1:反编译
我已经按照评论中的要求使用 ILSpy(版本:ILSpy 7.2)反编译了 .dll
,结果为以下输出。
// 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[] { })]
我在反编译 .dll
时也找到了一些参考资料。我不知道这是否重要,但无论如何我都会提供。
// 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
编辑 2:反编译 V2
我已设法添加缺失的参考 IKVM.Runtime
。尽管如此,我还是找不到有关命名空间、class 或方法的任何信息。
首先,您使用 class 作为名称空间,这可能是不正确的。您的方法调用可能看起来像这样:
var adder = new Adding();
Console.WriteLine(adder.Add(1, 2));
如果这不起作用,我会 inspect the produced dll 验证它是否是符合标准的 .net dll。这还应该显示名称空间、class 名称和其他信息。 dotPeek 或 ilSpy 等反编译器可能会以更易于阅读的格式显示相同的信息。
因为你的 Java class 在 ws
包中,你的 C# 代码中应该是 using ws
:
using ws;
Adding adding = new Adding();
Console.WriteLine(adding.Add(1, 2));
如果你想静态调用Add
方法,在Java中声明它static
:
package ws;
public class Adding
{
public static int Add(int a, int b)
{
return a + b;
}
}
using ws;
Console.WriteLine(Adding.Add(1, 2));
初始情况
我今天对我的项目进行了一些测试 - 目标:将 .jar
文件作为 .dll
实施到 C#
项目中。我当前的 .java
/ .jar
文件如下所示。
package ws;
public class Adding
{
public int Add(int a, int b)
{
return a + b;
}
}
我成功地将上面的内容转换成了 .dll
with IKVM (Version: 7.5.0.2).
我现在想在我的 C#
项目中引用这个 .dll
并调用 Add(int a, int b)
方法。我已经像这样添加了参考:
无论如何我无法调用该方法,因为编译器找不到 .dll
引用..
using Adding; // <= Compiler Error CS0246 (Can't find the reference)
Console.WriteLine(Add(1, 2));
有人知道我怎样才能做到这一点吗?我非常感谢任何形式的帮助,干杯!
编辑 1:反编译
我已经按照评论中的要求使用 ILSpy(版本:ILSpy 7.2)反编译了 .dll
,结果为以下输出。
// 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[] { })]
我在反编译 .dll
时也找到了一些参考资料。我不知道这是否重要,但无论如何我都会提供。
// 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
编辑 2:反编译 V2
我已设法添加缺失的参考 IKVM.Runtime
。尽管如此,我还是找不到有关命名空间、class 或方法的任何信息。
首先,您使用 class 作为名称空间,这可能是不正确的。您的方法调用可能看起来像这样:
var adder = new Adding();
Console.WriteLine(adder.Add(1, 2));
如果这不起作用,我会 inspect the produced dll 验证它是否是符合标准的 .net dll。这还应该显示名称空间、class 名称和其他信息。 dotPeek 或 ilSpy 等反编译器可能会以更易于阅读的格式显示相同的信息。
因为你的 Java class 在 ws
包中,你的 C# 代码中应该是 using ws
:
using ws;
Adding adding = new Adding();
Console.WriteLine(adding.Add(1, 2));
如果你想静态调用Add
方法,在Java中声明它static
:
package ws;
public class Adding
{
public static int Add(int a, int b)
{
return a + b;
}
}
using ws;
Console.WriteLine(Adding.Add(1, 2));