Изменение соглашения о вызове делегата С# на CDECL

У меня была эта проблема с С#, когда я использовал DotNet1.1

Проблема в этом. У меня есть неуправляемая dll, которая имеет функцию, которая принимает указатель на функцию (среди других аргументов). Когда я объявляю DLLImport в коде С#, я передаю делегат. Но делегаты на С# имеют соглашение о вызове stdcall, тогда как неуправляемая функция ожидает указатель функции cdecl. Таким образом, мой наивный подход привел к авариям. Затем я обнаружил следующее: http://www.codeproject.com/KB/cs/cdeclcallback.aspx. Какой-то парень написал отличную библиотеку, которая позволяет изменять соглашение о вызове делегата, как я понял, MSIL-взлома. Все прошло хорошо, пока...

Я перешел на VS2008 и новую версию .NET. В этой версии вышеупомянутая библиотека не работает. Я действительно не эксперт на С# или .NET, и, честно говоря, я едва понимаю, что делает его библиотека (хотя это open-source), поэтому я даже не хочу пытаться адаптировать ее к новой .NET. Однако я надеюсь, что более новая версия С# имеет лучшее решение для моей проблемы.

Итак, эксперты SO, пожалуйста, помогите мне с моей болью в ягодицах:)

Ответы

Ответ 1

По умолчанию система p/invoke переносит ваш делегат в функцию stdcall. Вы можете изменить сгенерированное соглашение об обертке с помощью атрибута UnmanagedFunctionPointer:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();