Изменение соглашения о вызовах делегата C# на CDECL
у меня была эта проблема с C#, когда я использовал DotNet1.1
проблема заключается в следующем. У меня есть неуправляемая dll, которая имеет функцию, которая принимает указатель функции (среди других аргументов). Когда я объявляю DLLImport в коде C#, я передаю делегат. Но делегаты в C# есть stdcall
соглашение о вызове, тогда как неуправляемая функция ожидает cdecl
указатель на функцию. Таким образом, мой наивный подход привел к аварии. Затем я обнаружил следующее:: http://www.codeproject.com/KB/cs/cdeclcallback.aspx какой-то парень написал отличную библиотеку, которая позволяет изменять соглашение о вызове делегата, как я понял, MSIL-hacking. Пока все шло хорошо...
я перешел на VS2008 и новую версию .Сеть. В этой версии вышеупомянутая библиотека не работает. Я на самом деле не эксперт C# или .NET, и, по правде говоря, я едва понимаю, что делает его библиотека (хотя она с открытым исходным кодом), поэтому я даже не хотите попробовать адаптировать его к новому .Сеть. Однако я надеюсь, что более новая версия C# имеет лучшее решение для моей проблемы.
Так, так эксперты, пожалуйста, помогите мне с моей болью в ягодицах:)
1 ответов
по умолчанию система P / invoke обертывает ваш делегат в функцию stdcall. Вы можете изменить соглашение о вызове сгенерированной оболочки, используя UnmanagedFunctionPointer
:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();