Моя проблема в том, что у меня есть некоторые функции в DLL, например, некоторые из этих функций:
#include <string>
using namespace std;
extern "C" __declspec(dllexport) string __cdecl encryption(string s)
{
return s;
}
Всякий раз, когда я пытаюсь вызвать эту функцию из C #, я использую следующий код:
[DllImport("Packer.dll", EntryPoint = "encryption")]
static extern string encryption(string s);
Я получаю сообщение об ошибке: вызов функции PInvoke Packer привел к разбалансировке стека. Вероятно, это связано с тем, что подпись управляемого PInvoke не соответствует подписи неуправляемого целевого объекта. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
Я предполагаю, что получаю эту ошибку, потому что у меня нет правильных объявлений для функции, может ли кто-нибудь подсказать мне, как это исправить, заранее спасибо
string
, тогда среда CLR попытается освободить память, возвращаемую функцией, как если бы это былаBSTR
. Простое изменение собственного возвращаемого типа не является решением. 05.10.2011CoTaskMemAlloc
), поэтому это совместимо с тем, как P / Invoke будет пытаться освободить эту память. 06.10.2011char*
как IntPtr, а затем используетеMarshal.PtrToStringAnsi()
для созданияSystem.String
, вы добьетесь «простого возврата указателя на буфер» без необходимости вызыватьCoTaskMemAlloc
:) 06.10.2011StringBuffer
и позвольте фреймворку творить чудеса! 06.10.2011