The downsides really lie in C# being a managed language, you lose a lot of control. For example all of your code will get compiled into RWE memory at runtime which complicates self validation. The compiled code itself also relies strongly on the CLR module which provides even further opportunities to reroute your execution. Further, because of its high level, it's trivial to decompile, making RE much simpler. Finally, as an AC, you're going to eventually need more low level code such as custom assembly blocks for manual syscalls or hooking a custom prototype. None of these downsides are completely 'unfixable' (you can use a worker native module for what's needed, virtualize important code blocks, etc.) but it makes your job that much harder. In the end it depends on what your goals are, but for most purposes you're far better off native for this type of job.