在哪里可以找到Java转C#的转换器?

45

我需要将一个基于Java 1.5SE的应用程序转换成C# 2.0。

请问有没有任何工具(最好是免费/开源)可以完成这个转换过程?


4
使用最好的工具,就是你的手指和大脑。 - Michael Meadows
1
因为Java语言转换助手不再可用,所以我添加了悬赏。我已经找到了Sharpen,但还有其他工具吗? - Residuum
相关 https://dev59.com/gHNA5IYBdhLWcg3wmfK5工具将Java转换为C#代码 - StayOnTarget
1
又一个好问题被关闭了。 - Tuntable
9个回答

30
即使有这样的工具,我仍强烈建议您手动转换。自动转换器通常会忠实地复制代码,但会忽略惯用语--因为这些语言真的很难得到正确的转换。
此外,.NET和Java中泛型之间的差异可能会导致两个代码库中做出非常不同的决策。
说实话,您最好手动转换。

我同意。我确实看过Java语言转换助手,用于一个相对较小的项目进行转换后需要的清理工作并不比重写需要的工作显著减少。 - Brian Rasmussen
同上,但尽管强烈警告相关客户,仍然发生了多次。 - Michael Meadows

27

6
Mono团队刚发布了Sharpen的新版本,他们使用它将Android翻译为C#。https://github.com/xamarin/XobotOS - pnewhook
1
FYI Sharpen 是一个 Eclipse 插件。 - Jess
还有一个命令行版本的Sharpen/port:https://github.com/mono/sharpen - Peter Kofler

16

Java语言转换助手。可选安装至(至少)Visual Studio 2005标准版。

选择文件/打开/转换/Java语言转换助手。

记得手动检查代码。它会有很多问题。


在将Java转换为C#方面是否有其他选择?我已经成功地使用VS2005将Java代码转换为C#,而且手动修改不是太多,我真的很喜欢它。 - Gant
6
它不仅在实现层面上会有问题,而且它的设计也不符合 .NET 的惯例。再次强调,手动移植... - Jon Skeet
2
手动转换总是必要的,但很多代码可以原封不动地移植过来。在移植时,替换一些小的语法差异,比如使用 final、checked 异常和 synchronized 等,会有很大帮助。 - Eric Hauser
1
但在VS2010中似乎找不到它? - Brady Moritz
谢天谢地,它一定挂了!伙计,手动做这个。 - Brad
2
JLCA已停止开发,请参见https://dev59.com/TE7Sa4cB1Zd3GeqP4Ibu。 - Peter Kofler

13

ikvm可以在.NET中公开Java类。它不是一个转换器,但根据我的经验,我建议任何从Java转向.NET的人使用它。


7

我现在正在测试 Tangible Solution(这不是免费的)

Tangible Source Converter

它添加了一个类助手。但在外部,结果看起来很好。

Java:(原始内容)

public class PackVariableArrays {


private ClassError myerror=new ClassError();


public VariableArrays unpack(String txt) {
    VariableArrays pc = new VariableArrays();
    Variable lc;
    txt=txt.replace("\r\n","\n");
    setMyerror(new ClassError());
    if (txt==null) {
        lc=new Variable();
        lc.name="ERV-5: Empty values";
        pc.addItem(lc);

        return pc;
    }
    String[] linecode = txt.split(ClassUtil.SEPARATOR2);
    int blen = 0;
    int tmpint = 0;

    int numelement = 9999;

C# (conversion)

public class PackVariableArrays {


    private ClassError myerror =new ClassError();


    public virtual VariableArrays unpack(string txt) {
        VariableArrays pc = new VariableArrays();
        Variable lc;
        txt=txt.Replace("\r\n","\n");
        Myerror = new ClassError();
        if (txt==null) {
            lc=new Variable();
            lc.name="ERV-5: Empty values";
            pc.addItem(lc);

            return pc;
        }
        string[] linecode = StringHelperClass.StringSplit(txt, ClassUtil.SEPARATOR2, true);
        int blen = 0;
        int tmpint = 0;

        int numelement = 9999;

这是一个简单的案例,但它运行良好。然而,正如我之前所说,它使用了一个Class Helper (StringHelperClass.StringSplit),虽然它可以工作,但没有必要。在外部,结果代码非常清晰。


6
虽然这两种语言的语法看起来相似,但语义上有很大的区别。以下是一些区别:
  • 泛型:Java编译所有内容为对象,而C#保留了泛型类型。
  • 异常:Java有受检异常,而C#没有。
  • 匿名类和内部类:Java有匿名类和嵌套类,而C#没有。相反,C#有委托和事件。因此,编程模型非常不同。
  • 委托:C#有函数指针的概念,这导致了一种不同的编程方式。
  • 事件:C#有事件和组件的概念,这导致了一种不同的编程方式。
  • API:尽管将所有语义差异放在一边,这两种语言都有庞大的API,两者都不容易转换。
换言之,你不能自动地进行这样的转换。如果将代码转换为 .exe 文件是改用 C# 的原因,Java 市场也有各种选项。

1
C#确实有嵌套类。我原以为你错了,所以进行了一些研究,结果发现内部类(Java的一个特性)与嵌套类(两者都有的)是不同的。这是一个有趣但不太明显的细微差别。 - Peter Wone
是的,内部类和嵌套类不同。 - Carlo V. Dango
这些差异都不是致命的。将来肯定会有转换大型代码库某些部分的需求。与HTTP等相关的事情也会有所不同。 - Tuntable

3

似乎无法下载? - Brady Moritz

2

你尝试过XMLVM吗? 它有一个选项可以自动转换成C#代码,像这样:

xmlvm --in=myjar.jar --out=output_dir --target=csharp

1

最近,Xamarin使用Sharpen将Android移植到了Mono上。请查看this链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接