【问题标题】:Where can I find a Java to C# converter? [closed]在哪里可以找到 Java 到 C# 的转换器? [关闭]
【发布时间】:2016-12-05 01:46:36
【问题描述】:

我需要将 Java 1.5se 应用程序转换为 C# 2.0。

有没有人知道可以执行此操作的工具(最好是免费/开源)?

【问题讨论】:

  • 使用最好的工具。你的手指和大脑。
  • 添加了赏金,因为 Java 语言转换助手不再可用。我找到了 Sharpen,但是还有其他工具吗?
  • 另一个好问题结束了。

标签: c# java


【解决方案1】:

即使有这样的工具,我也强烈建议您手动进行转换。自动转换器通常会忠实地重现代码,但会忽略惯用语——因为它们真的很难正确处理。

此外,.NET 和 Java 中泛型之间的差异可能导致两个代码库中的一些非常不同的决定。

真的,你最好手工做。

【讨论】:

  • 我同意。我确实为一个相对较小的项目查看了 Java 语言转换助手,转换后所需的清理工作并没有明显小于重写所需的工作。
  • 同上,但多次强调警告各自的客户。
【解决方案2】:

一个很好用的工具叫做 Sharpen,它是开源的。

此工具已由 Xamarin 团队分叉和更新,他们使用它将 Android API 转换为 C#。他们的副本可以在这里找到:

【讨论】:

  • Mono 团队刚刚发布了一个新版本的 Sharpen,他们用它来将 Android 转换为 C#。 github.com/xamarin/XobotOS
  • 仅供参考 Sharpen 是一个 Eclipse 插件。
  • 还有一个用于命令行的 Sharpen/port 版本:github.com/mono/sharpen
【解决方案3】:

Java Language Conversion Assistant。可选地与(至少)Visual Studio 2005 标准版一起安装。

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

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

【讨论】:

  • 在将 Java 转换为 C# 时还有其他选择吗?我已经成功使用 VS2005 将 Java 代码转换为 C#,没有太多的手工修改,我真的很喜欢。
  • 它不仅会在实现级别出现问题,而且不会以 .NET 惯用的方式设计。我再说一遍,手动移植......
  • 手动转换总是需要的,但是很多代码可以照原样进行。在移植时替换小的语法差异,如使用 final、检查的异常和同步有很长的路要走。
  • 在 vs2010 中似乎没有?
  • JLCA 已停产,请参阅stackoverflow.com/questions/3070261/…
【解决方案4】:

ikvm 在 .NET 中公开 java 类。它不是转换器,但根据我的经验,我会向任何从 java 过渡到 .NET 的人推荐它

【讨论】:

    【解决方案5】:

    虽然这两种语言的语法看起来很相似,但语义却大不相同。提几个这两种语言误入歧途的地方

    • 泛型,Java 将所有内容编译为对象,C# 保留泛型类型
    • 异常,Java 已检查异常,C# 没有
    • 匿名类和内部类,Java 有匿名类和嵌套类,C# 两者都没有。相反,C# 有委托和事件。因此,编程模型非常不同
    • 代表们,C# 具有函数指针的概念,这导致了不同的编程方式。
    • 事件,C# 具有事件和组件的概念,这导致了不同的编程方式。
    • API,撇开所有语义差异不谈,两种语言都有巨大的 API,它们都没有经过简单的转换。

    换句话说,您将无法自动进行此类转换。如果更改为 C# 的原因是为了能够将您的代码转换为 .exe 文件,那么 Java 市场上也有各种选择。

    【讨论】:

    • C# 确实有嵌套类。我以为你错了,所以我做了一些研究,似乎内部类(Java 的东西)与嵌套类(两者都存在)不同。一个有趣但晦涩的微妙之处。
    • 是的,内部类和嵌套类不一样。
    • 这些差异都不是致命的。肯定会有一个地方可以转换大型代码库的某些部分。与 HTTP 等有关的事情会有所不同。
    【解决方案6】:

    现在,我正在测试有形解决方案(不是免费的)

    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#(转换)

    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;
    

    这是一个简单的案例,但效果很好。然而,正如我之前所说,它使用了一个类助手(StringHelperClass.StringSplit),这很好,但它是不需要的。在它之外,结果代码非常清晰。

    【讨论】:

      【解决方案7】:

      微软曾经有自己的 Java 到 C# 转换器 - Microsoft Java Language Conversion Assistant 3.0

      【讨论】:

      • 似乎无法下载?
      【解决方案8】:

      你试过XMLVM 吗? 它有一个自动转换为 C# 的选项,如下所示:

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

      【讨论】:

        【解决方案9】:

        最近 Xamarin 已使用锐化将 android 移植到单声道。查看this 链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-28
          • 2011-06-13
          • 2011-02-23
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 2013-06-27
          • 2010-10-26
          相关资源
          最近更新 更多