sahrarainmelody Ответов: 4

преобразование исходного кода c в c#


привет

у меня есть программа на языке Си, и я хочу преобразовать ее в c#, но моя программа содержит более 3000 строк ...

так что, пожалуйста, дайте мне несколько советов, чтобы сделать

есть ли какой-нибудь способ обратиться?

Zoltán Zörgő

Мое предположение (возможно, ошибочное): это случай повторного использования. Домашнее задание, сделанное много лет назад в C, "хочет быть" переиздано другим учеником другому учителю в c# :)

sahrarainmelody

нет, парень, ты ошибаешься ... это выход потока состояний, который я пытаюсь преобразовать it.it шоуд стал визуальным
.
.
.
в любом случае спасибо

4 Ответов

Рейтинг:
31

Sergey Alexandrovich Kryukov

Способ преобразования состоит в том, чтобы изучить соответствующие алгоритмы из исходного кода или иным образом, а затем реализовать приложение на языке C#. Некоторые фрагменты кода могут быть более или менее буквальным переводом с несколько иным синтаксисом, но большинство должно быть глубоко другим. В свою очередь, скорее всего, многие вещи, которые вы найдете в программе C, могут быть выброшены, потому что они уже реализованы в библиотеках .NET. Все это сильно зависит от характера оригинальной программы. Например, большая часть чисто числовых вычислений может быть очень похожа.

Если вы надеялись на какой — то "автоматический" способ преобразования- просто забудьте об этом. Языки и особенно платформы очень, очень разные, как концептуально, так и формально.

Однако вы можете рассмотреть некоторые альтернативы, не связанные с переводом.

Первый из них: вы можете переписать исходное приложение word в собственную DLL, а затем использовать его в своем приложении C# с помощью P/Invoke. Если вам нужно изучить P/Invoke, пожалуйста, смотрите:
http://en.wikipedia.org/wiki/P/Invoke[^],
http://msdn.microsoft.com/en-us/library/Aa712982[^].

Эта статья CodeProject также может быть полезна: Essential P/Invoke[^].

[РЕДАКТИРОВАТЬ]

В ответ на последующие вопросы:

Приведенные выше ссылки полезны для использования неуправляемых библиотек DLL, если они уже доступны. Чтобы переработать код C в DLL и экспортировать функцию, которая будет использоваться сборками .NET, пожалуйста, начните отсюда:
http://msdn.microsoft.com/en-us/library/1ez7dh12%28v=vs.100%29[^],
http://msdn.microsoft.com/en-us/library/z4zxe9k8%28v=vs.100%29.aspx[^].

Вы можете найти гораздо больше справок по созданию DLL-файлов. Убедитесь, что вы используете только те типы, которые .Сеть может понять. Если вы пытаетесь использовать только примитивные типы, строки и перечисления, это легко. Структуры и указатели, отличные от строк, немного сложнее. Сначала постарайтесь сделать интерфейсы между библиотеками DLL и .NET как можно более простыми.

[КОНЕЦ РЕДАКТИРОВАНИЯ]

Второй: вы можете использовать смешанный режим (управляемый+неуправляемый) проект C++/CLI для встраивания существующего кода C. Такой проект может более или менее свободно смешивать C++, C++/CLI и C-код. Вы можете обернуть свой код C в некоторые управляемые классы/структуры "ref" и сделать их общедоступными. Полученный исполняемый модуль можно использовать как обычную сборку .NET, на которую ссылается ваше приложение C#. Пожалуйста смотрите:
http://en.wikipedia.org/wiki/C%2B%2B/CLI[^],
http://www.ecma-international.org/publications/standards/Ecma-372.htm[^],
http://www.gotw.ca/publications/C++CLIRationale.формат PDF[^],
http://msdn.microsoft.com/en-us/library/xey702bw.aspx[^].

Удачи,

—СА


sahrarainmelody

большое спасибо ...

я пытаюсь использовать способ "DLL": я создаю dll-файл своего кода и вызываю его в файле c#, но моя программа состоит из 3 исходных кодов c, и я должен присоединиться к ним, и я знаю что-нибудь о c .я могу создать dll для одного, но 3 ...нет .

и еще одно : я вижу


http://msdn.microsoft.com/en-us/library/aa288468(v=против 71).aspx


тоже, но эти страницы не говорят нам, что, как мы можем создать dll-файл из источника c ... не могли бы вы помочь мне еще?

Sergey Alexandrovich Kryukov

С одной DLL это вполне выполнимо, но просто требует некоторого внимания. Когда вы работаете с исходным кодом, нет большой разницы, объедините ли вы его в одну библиотеку DLL или нет. Кроме того, вы можете иметь 3 отдельных библиотеки DLL. Я бы также посоветовал сделать его проектом C++, который может содержать как исходный код C, так и C++. С помощью C++ создание библиотек DLL становится проще.

Конечно, мои ссылки касаются только использования собственных библиотек DLL в .NET, а не создания библиотек DLL в Windows. Я думал, ты все знаешь. Вы можете легко найти справку по созданию библиотек DLL. Точнее, речь идет об экспорте функций в DLL.

--СА

Sergey Alexandrovich Kryukov

В ответ на этот запрос я добавил еще одну ссылку к ответу, после [EDIT], чтобы помочь научиться создавать неуправляемые библиотеки DLL и экспортировать функции.

--СА

BillW33

Очень хороший ответ, +5

Sergey Alexandrovich Kryukov

Спасибо,
--СА

Philippe Mori

Очень хороший ответ. Мы должны быть в состоянии проголосовать +10, чтобы компенсировать тот, который голосует 1 без уважительной причины.

Sergey Alexandrovich Kryukov

Спасибо, Филипп.
—СА

Рейтинг:
20

Zoltán Zörgő

Вы никогда не получите ожидаемого ответа.
1) Как я знаю, C не имеет .net enabled edition, поэтому вы не можете использовать промежуточный язык в качестве помощника
2) С действительно более низкие понятия чем любом управляемом языке
3) C-это не ОО, c# - это язык ОО, и очень хороший
4) мышление В С - это совершенно иное, чем мышление В С#
Вы не найдете никаких автоматических средств для этого перевода. Да и вообще это вообще невозможно сделать. Только в особых случаях может существовать эквивалент приложения C в C#.
И кстати, 3000 строк кода-это не так уж много...


Sergey Alexandrovich Kryukov

Хорошее объяснение, 5. Но я предложил некоторые альтернативы (кроме перевода), которые потенциально могут сработать, пожалуйста, смотрите мое решение.
--СА

Рейтинг:
12

OriginalGriff

Насколько мне известно, автоматического способа преобразования не существует - это удивительно сложная работа, поскольку C# не имеет понятия глобалов, не хочет, чтобы вы использовали указатели, и сильно привязан к ним .NET framework таким образом, функции, используемые вашим кодом C, не будут применимы в C#.

Я подозреваю, что ваш лучший подход будет заключаться в переписывании, а не в переводе, поскольку эти два языка гораздо более различны на практике, чем кажутся.

Перефразируя Уинстона Черчилля / Джорджа Бернарда Шоу: два языка разделены сходным синтаксисом.


Рейтинг:
1

Philippe Mori

В дополнение ко всем вышеприведенным ответам, которые действительно хороши, я бы добавил некоторые трюки, которые могут вам помочь.

Насколько хорошо он будет работать, во многом зависит от исходного кода. Было бы хорошей идеей преобразовать его? Это тоже зависит. Такое преобразование может работать относительно хорошо для математических вещей или, возможно, шифрования. Напротив, это не будет хорошо работать, если ваш код зависит от многих библиотек C, сложных макросов...

Это будет до вас, чтобы оценить, какой вариант является лучшим:
- Попробуйте преобразовать код вручную.
- Переписать весь код на C# (и использовать только старый код в качестве ссылки).
- Поместите свой код C в библиотеку DLL и используйте его либо с P/Invoke, либо в сборке смешанного режима.

Вы можете начать с копирования существующего кода C в файл C# и поместить все функции в класс. Сделайте этот класс static и все функции public static.

Удалите включает в себя и другие специфические вещи c.

Для каждой функции в C код, сделать private static функция с точно таким же именем, как и исходная. Например:

public static class ConvertCodeInC {
  // Copy C code here...

  // Sample function (add required using as appropriate for your code)
  private static double fabs(double x) => Math.Abs(x);

  private static void more_complete_function_here(int value)
  {
    // Some code here...
  }
}


Вы также можете конвертировать макросы в константы или функции по мере необходимости. Типы обновлений.

Многое из этого можно сделать с помощью поиска и замены. Например, заменить unsigned int с uint. Также заменить -> с ..

После того, как программа будет преобразована, вы можете сделать метод переименования, чтобы удалить бесполезные временные функции, такие как fabs в моем примере. Если функция используется всего несколько раз и является тривиальной, было бы проще немедленно обновить ее для вызова .Чистая эквивалентная функция.

Имейте в виду, что такие вещи, как поиск и замена, могут быть несколько опасны в подобном случае, поэтому часто сохраняйте и при необходимости подтверждайте каждое изменение.

После того, как код компилируется, вы можете сделать его более .NET, рефакторинг его для использования .Например, соглашение об именовании сети.


Patrice T

Вопрос стоит с 2012 года !

Philippe Mori

Обычно я не обращаю внимания на исходную дату, так как проверяю только недавно добавленные/обновленные вопросы.

Patrice T

С тех пор как прошло несколько недель, старые вопросы появляются на вершине списка без всякой очевидной причины.

Sergey Alexandrovich Kryukov

Я бы сказал, что дата не имеет значения, особенно если на вопрос был дан недостаточно хороший ответ.
—СА

Sergey Alexandrovich Kryukov

5ед.
Свежий ответ? Интересно, что снова вызвало интерес к этому вопросу в 2012 году?..
—СА

Southmountain

Спасибо за Филиппа. Ваши комментарии очень полезны для моего проекта.