Вызывать код C ++ из приложения C # или портировать его? - PullRequest
5 голосов
/ 08 мая 2009

Я недавно боролся с алгоритмом , который был плохо реализован (то есть, разработчик был переведен на другой проект и не смог адекватно документировать то, что он сделал) в C #.

Я нашел альтернативу (из числовых рецептов), которая работает, но написана на C ++. Поэтому я думаю, что, вероятно, самый безопасный способ заставить что-то работать - это обернуть C ++ в DLL.

Учитывая, что я все еще немного зелен, когда дело доходит до C # и никогда не пытался сделать DLL с нуля, это звучит как разумный подход (и если да, кто-нибудь пробовал это / получил какой-либо совет) ? Или я должен пойти на все и попытаться перенести подпрограмму C ++ в C #?

Редактировать - Я не ищу, чтобы кто-то принимал решение за меня, но если у кого-то есть опыт в любом из этих маршрутов, мне было бы интересно услышать их мнение и любые неприятные ловушки, избегать. Например, как неприятно передавать списки данных из C # в вектор C ++ STL?

Ответы [ 4 ]

4 голосов
/ 08 мая 2009

Я попытался связать c-dll из кода c # с довольно хорошими результатами, хотя у меня были некоторые проблемы с передачей данных между средами. В противном случае процедура довольно проста. Чем больше данных вы отправляете туда и обратно (как по количеству, так и по частоте), тем медленнее будет работать ваша программа, но вы, вероятно, уже поняли это самостоятельно.

Основным недостатком было поддержание связующего кода c # -c (кода интерфейса) каждый раз, когда что-то менялось или кто-то обнаруживал ошибку.

Вот код, с которого можно начать:

using System.Runtime.InteropServices;
    class myDllCaller {

       //call to function in the dll returning an int
      [DllImport("MyFavorite.dll")]
      private static extern int dllFunction(//list of parameters to function);

    public static void Main() {
    int rerult = dllFunction();

    }
}
2 голосов
/ 08 мая 2009

Если ссылки на Mitch версии C # не подходят для ваших целей, вы можете использовать управляемую оболочку C ++, которая может повторно использовать и оборачивать имеющийся у вас код C, но при этом оставаться видимой для ваших управляемых приложений как родная .Нет сборка. В прошлом я использовал этот подход для использования C API библиотеки, у которой не было собственного нативного .Net API, и обнаружил, что данные между ними относительно безболезненно распределены.

1 голос
/ 08 мая 2009

... Или вы можете скачать уже реализованный код на C # с здесь .

1 голос
/ 08 мая 2009

Это зависит от ваших целей.

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

Если это улучшить ваш C #, то непременно переписайте C.

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