Изменение соглашения о вызове делегата С# на 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();