Я изучаю разработку приложения, которое будет обрабатывать данные с камеры сканирования строк со скоростью около 2000 строк (кадров) в секунду. Для этого приложения в реальном времени я чувствую, что C/С++ - это путь. (Это мое чувство, и другие согласятся, что управляемый код просто не подходит для этой задачи.)
Однако, я сделал очень мало MFC или любой другой графический интерфейс С++. Я действительно очень хорошо делаю С# GUI.
Поэтому мне кажется естественным написать интенсивный для данных код в C/С++ и графический интерфейс на С#. GUI будет использоваться для настройки/калибровки/он-лайн мониторинга (и, возможно, вывода данных через UDP, потому что это проще в С#.
Итак, во-первых, я хотел бы посмотреть, согласен ли кто-нибудь с тем, что это будет путь. Основываясь на моем опыте программирования (хорошо на низкоуровневых алгоритмах C и высоком графическом дизайне С#), он просто чувствует себя хорошо.
Во-вторых, я не уверен, как правильно это сделать. Я просто собрал решение в VS2005, которое вызывает некоторые (внешние) C-DLL-функции из приложения С#. И чтобы убедиться, что я могу это сделать, я написал некоторые глобальные переменные в DLL и прочитал их:
test.h
int globaldata;
extern "C" __declspec(dllexport) void set(int);
extern "C" __declspec(dllexport) int get();
test.cpp
extern int data=0;
__declspec(dllexport) void set(int num) {
data = num;
}
__declspec(dllexport) int get() {
return data;
}
test.cs
[DllImport("test")]
private static extern void set(int num);
[DllImport("test")]
private static extern int get();
Вызов get()
и set()
работает правильно (get()
возвращает число, которое я передал в set()
).
Теперь я знаю, что вы также можете экспортировать класс С++, но нужно ли это управлять? Как это работает? Правильно ли я делаю это?
Спасибо за вашу помощь!
*** EDIT ***
Прежде всего, СПАСИБО за ваши фантастические ответы! Я всегда невероятно впечатлен переполнением стека...
Я полагаю, что одна вещь, на которую я должен был наткнуться больше, не обязательно была необработанной скоростью (это может быть прототип и бенчмаркинг). Одна вещь, которая меня больше волнует, - это недетерминированное поведение Мусора. Это приложение не будет терпимым к задержке в 500 мс при выполнении сбора мусора.
Я все для кодирования и пробовал это в чистом С#, но если я заранее знаю, что GC и любое другое недетерминированное поведение .NET(?) вызовут проблему, я думаю, что мое время было бы лучше потрачено кодируя его на C/С++ и выясняя лучший интерфейс С#.