Самый простой способ взаимодействия между C / C ++ DLL и сборкой .NET - через p / invoke. На стороне C / C ++ создайте DLL, как и любую другую. На стороне C # вы создаете объявление p / invoke. Например, скажите, что ваша DLL - mydll.dll, и она экспортирует метод void Foo()
:
[DllImport("mydll.dll")]
extern static void Foo();
Вот и все. Вы просто вызываете Foo, как и любой другой метод статического класса. Сложная часть - сбор данных, и это сложный вопрос. Если вы пишете DLL, вы, вероятно, можете сделать все возможное, чтобы упростить функции экспорта. Подробнее о p / invoke marshalling смотрите здесь: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx.
Вы получите удар по производительности при использовании p / invoke. Каждый раз, когда управляемое приложение выполняет неуправляемый вызов метода, оно выполняет удар, пересекающий управляемую / неуправляемую границу, а затем снова возвращается. Когда вы собираете данные, происходит большое копирование. При необходимости копирование может быть уменьшено с помощью «небезопасного» кода C # (с помощью указателей для прямого доступа к неуправляемой памяти).
Что вам следует знать, так это то, что все .NET-приложения переполнены вызовами p / invoke. Ни одно приложение .NET не может избежать вызовов операционной системы, и каждый вызов ОС должен попадать в неуправляемый мир ОС. WinForms и даже приложения WPF GUI совершают этот путь много сотен, даже тысячи раз в секунду.
Если бы это было моей задачей, я бы сначала сделал это на 100% в C #. Затем я бы профилировал и настроил производительность по мере необходимости.