2012-02-14 3 views
1

У меня есть поток байтов, который я сортирую по строкам. Теперь мне нужно обновить C# GUI, используя значения из этих структур. Теперь я нашел вещи о pinvoke и dllimport с помощью Google, но все вызывает код c C#, мне нужно сделать наоборот.C api to C# GUI

Код C# имеет функции, которые вращают циферблаты/обновляют значения, поэтому, как только у меня есть значения, которые мне нужны, я хочу просто вызвать эти функции, с этими значениями в качестве параметров, мой код c все написан, и gui закодирован и функционально используя циферблаты, которые я таскаю с помощью мыши, мне просто нужно склеить их вместе.

Спасибо за помощь!

+1

Все функции, которые вам нужно вызвать, находятся в dll (в отличие от exe), правильно? Я бы подумал, что вы можете ссылаться на эту DLL с C, поэтому я не уверен, что вы проблема, точно ... хотя похоже, что вы можете использовать события. Когда вы говорите «C-код», вы говорите о визуальном C++ или вы говорите о компиляторе c? –

+0

У меня создалось впечатление, что вы не пробовали функцию поиска, прежде чем задавать этот вопрос: [Можно вызвать код C++ из C#?] (Http://stackoverflow.com/questions/935664/possible-to-call-c- code-from-c), [Calling C# code from C++] (http://stackoverflow.com/questions/778590/calling-c-sharp-code-from-c), [Как вызвать код C# из C-кода? ] (http://stackoverflow.com/questions/9056048/how-to-call-c-sharp-code-from-c-code), [Передача функции обратного вызова C# через Interop/pinvoke] (http: // stackoverflow .com/questions/7970128/pass-ac-sharp-callback-function-through-interop-pinvoke), среди прочих. –

+0

@cody Lol, у меня создается впечатление, что вы не читали весь свой пост. все: им используется только c и C# –

ответ

0

Как насчет того, как вы вызываете свой C-код из C# с помощью PInvoke, заставьте C-код вернуть некоторые данные, а затем использовать C# -приложение данных для обновления GUI? Есть ли какая-то причина, по которой вы не можете иметь код C#, который должен быть «ответственным», только когда вы вызываете код C, когда это необходимо, и в противном случае просто перебираете поток пользовательского интерфейса? Почему вы хотите, чтобы ваш C-код мог обновлять графический интерфейс?

+0

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

+0

Это телеметрическая система кстати. Живой поток данных AHRS, который обновляет C# gui несколькими инструментами, найденными в кабине самолета. –

2

Вообще говоря, вы не можете вызывать код C# из кода C. (Вы можете вызвать назад в C# код из кода C, но C# сторона должна инициировать процесс и передавать в функции обратного вызова.)

«Правильный путь» для C# код для вызова в код C и предоставить функцию обратного вызова (найдите атрибут UnmanagedFunctionPointer для того, как превратить управляемый делегат в указатель функции.)

Если этот вариант невозможен, у вас есть несколько альтернатив, но ни один из них не будет так же просто, как просто «склеивание вещи вместе»:

  • Использование смешанной библиотеки C++ для смены кода C и C# , Это беспорядок, ИМО, и я предлагаю это только потому, что это наименьшее количество изменений для вашего кода на C.
  • Экспозиция COM-объекта из кода C# и связь с ним с C. Чуть менее беспорядочно, чем вариант A, но ценой введения COM в микс.
  • Используйте некоторую форму межпроцессных коммуникаций (сокеты TCP, именованные каналы и т. Д.) И обменивайтесь данными между двумя элементами кода, как если бы они были отдельными программами.