Я портирую библиотеку Java на C#. Я использую Visual Studio 2008, поэтому у меня нет прекращенной программы Microsoft Java Language Conversion Assistant (JLCA).
Мой подход состоит в том, чтобы создать новое решение с аналогичной структурой проекта для библиотеки Java, а затем скопировать код Java в файл C# и преобразовать его в действительный C# построчно. Учитывая, что я нахожу Java легко читаемым, тонкие различия между двумя языками меня удивили.
Некоторые вещи легко переносить (пространства имен, наследование и т. д.), Но некоторые вещи неожиданно изменились, например, видимость закрытых членов во вложенных классах, переопределение виртуальных методов и поведение встроенных типов. Я не совсем понимаю эти вещи и уверен, что есть много других отличий, которых я еще не видел.
Мне предстоит долгий путь над этим проектом. Какие практические правила я могу применить во время этого преобразования, чтобы правильно управлять языковыми различиями?





Вы делаете это единственно разумным способом ... самым большим подспорьем будет этот документ от Dare Obasanjo, в котором перечислены различия между двумя языками:
http://www.25hoursaday.com/CsharpVsJava.html
Кстати, измените все методы получения и установки на свойства ... Нет необходимости иметь функцию библиотеки C# так же, как библиотеку java, если вы не стремитесь к идеальной совместимости интерфейса.
Спасибо за ссылку - это отличный справочный материал для того, чем я занимаюсь.
"преобразовать все методы получения и установки в свойства" - лучше подумайте еще раз об этом. Правильнее было бы сказать, измените на свойства как указано в рекомендациях MSDN. Мне просто пришлось вернуть кучу «свойств» обратно к методам, которые: 1) установлены без получения 2) недетерминированные 3) возвращенные построенные массивы ... которые сделал кто-то другой. Слепое преобразование в свойства без учета того, что свойства должны действовать как поля, - не лучшая стратегия. Если сомневаетесь, оставьте это методом.
Я не уверен, действительно ли это лучший способ преобразовать код построчно, особенно если препятствия становятся огромными. Конечно, код Java дает вам руководство и базовую структуру, но я думаю, что в конце концов, наиболее важным является то, что библиотека действительно обеспечивает ту же функциональность, что и в Java.
На днях я слышал кое-что о версии Java .net. Если бы такой монстр был доступен, вы бы просто смогли скомпилировать исходный код java в промежуточные библиотеки .net?
Он действительно существует? Если да, то где вы об этом узнали?
Извините, сейчас не могу найти. Я считаю, что это было добавление к какому-то продукту (не на свободном языке), но мне следовало найти ссылки. Во всяком случае, это было 4 года назад - если бы это был продукт, то теперь его почти наверняка нет! :(
Если у вас небольшой объем кода, то, вероятно, наиболее эффективным будет построчное преобразование.
Если у вас большой объем кода, я бы подумал:
Стоит отметить еще пару вариантов:
J # - язык Java от Microsoft. реализация на .NET. Ты можешь доступ к библиотекам Java (до версии 1.4 *, так или иначе). * собственно Java 1.1.4 для java.io/lang, и 1.2 для java.util + имейте в виду, что конец J # жизнь ~ 2015-2017 для J # 2.0 redist
IKVM Моно также запускает Java на CLR с доступом к другим .NET программы.
Microsoft Visual Studio 2005 приходит с "преобразованием языка Java помощник ", конвертирующий Java программы в программы на C# автоматически для вас.
Имейте в виду, что Java 1.4 сейчас исполнилось 10 лет? По этой причине J # следует использовать только в исключительных случаях. Он был задуман как путь для существующих клиентов J ++ (помните?) К .NET. Не как общее решение Java-on-.NET.
Еще одна пошлая идея: вы можете использовать ИКВМ для преобразования jar-файла Java в сборку .NET, а затем использовать Отражатель - в сочетании с надстройкой FileDisassembler - для дизассемблирования его в проект Visual C#.
(Кстати, я на самом деле не использовал IKVM - кто-нибудь может поручиться, что этот процесс сработает?)
Можно использовать библиотеку IKVM, но если вы попытаетесь разобрать ее в Reflector, вы обнаружите, что некоторые из MSIL, сгенерированных IKVM, не могут быть разобраны в C#. Я предполагаю, что конструкции C# - это подмножество всех конструкций, которые возможны с IL, или, по крайней мере, Reflector обрабатывает только подмножество, которое является типичным / ожидаемым.
См. Здесь предложения по автоматическому преобразованию Java-to-C#: stackoverflow.com/questions/443010/…