C++ backend with C# frontend?

后端 未结 5 775
天涯浪人
天涯浪人 2021-02-08 07:45

I have a project in which I\'ll have to process 100s if not 1000s of messages a second and process/plot this data on graphs accordingly (The user will search for a set of data i

5条回答
  •  情话喂你
    2021-02-08 08:25

    The simplest way to interop between a C/C++ DLL and a .NET Assembly is through p/invoke. On the C/C++ side, create a DLL as you would any other. On the C# side you create a p/invoke declaration. For example, say your DLL is mydll.dll and it exports a method void Foo():

    [DllImport("mydll.dll")]
    extern static void Foo();
    

    That's it. You simply call Foo like any other static class method. The hard part is getting data marshalled and that is a complicated subject. If you are writing the DLL you can probably go out of your way to make the export functions easily marshalled. For more on the topic of p/invoke marshalling see here: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx.

    You will take a performance hit when using p/invoke. Every time a managed application makes an unmanaged method call, it takes a hit crossing the managed/unmanaged boundary and then back again. When you marshal data, a lot of copying goes on. The copying can be reduced if necessary by using 'unsafe' C# code (using pointers to access unmanaged memory directly).

    What you should be aware of is that all .NET applications are chock full of p/invoke calls. No .NET application can avoid making Operating System calls and every OS call has to cross into the unmanaged world of the OS. WinForms and even WPF GUI applications make that journey many hundreds, even thousands of times a second.

    If it were my task, I would first do it 100% in C#. I would then profile it and tweak performance as necessary.

提交回复
热议问题