У меня есть неуправляемая функция C++ со следующей подписью:Вызов функции C++ из C# - несбалансированный стек
int function(char* param, int ret)
Я пытаюсь вызвать из C#:
unsafe delegate int MyFunc(char* param, int ret);
...
int Module = LoadLibrary("fullpathToUnamanagedDll");
IntPtr pProc = GetProcAddress(Module, "functionName");
MyFunc func = (MyFunc)System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc));
unsafe
{
char* param = null;
int ret = 0;
int result = func(param, ret);
}
насколько я могу сказать от старой ++ спецификации проекта C и нулевой для паров и 0 для ret являются допустимыми входами для функции. Когда я пытаюсь вызвать его, кажется, работает, однако при выходе я получаю следующее сообщение об ошибке:
PInvokeStackImbalance was detected
A call to PInvoke function '...::Invoke' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.
Я пробовал почти все, что я мог думать от (небезопасным был последним средством), однако я не могу найти любой способ запустить функцию без получения неуравновешенного стека. Есть ли что-то еще, что я мог бы попробовать?
Нужно ли импортировать его в качестве делегата? Обычная декларация «статического extern» была бы намного проще. –
@ Хенк Холтерман: Полагаю, что нет, я получил этот код от коллеги, я предположил, что у него есть причина для этого. Тем не менее, я должен динамически загружать функцию во время выполнения, не зная имя (путь) или имя функции.Однако я знаю подпись функции во время разработки. Это можно сделать по-другому? –
«Динамично» - хорошая причина, и я думаю, что ответы @leppies - это то, куда вам нужно идти. –