Я провел много поиска и тестирования, и я не смог заставить это работать правильно. Я использую MVS Express 2013, компилируя DLL C++ win32, которую я надеюсь вызвать из C# GUI.Вызов C++ DLL из C# Program, необработанное исключение
На стороне C++, у меня есть функция, которую я экспортировал, и она получает переданную структуру. Первоначально структура содержала две строки, но проще передать массив символов известного размера.
C++ Код:
struct runDetails{
char requestedRuntype[32];
char filename[32];
};
void __declspec(dllexport) WindowRecreatorCall(runDetails* incomingRunRequests);
C# Код:
Попытка воссоздать STRUCT пройти в:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
public struct runDetails{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 32)]
public string requestedRuntype;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 32)]
public string filename;
};
Настройка динамической библиотеки DLL Wrapper:
class CallWindowRecreator
{
[DllImport("WindowRecreatorDLL.dll", EntryPoint = "WindowRecreatorCall", CharSet = CharSet.Unicode)]
public static extern void WindowRecreatorCall(ref runDetails runDetails);
};
Фактический вызов t он DLL:
runDetails testing;
testing.requestedRuntype = "Minimize";
testing.filename = "";
CallWindowRecreator.WindowRecreatorCall(ref testing);
Как это прямо сейчас, я получаю эту ошибку при попытке к DLL вызова:
Необработанное исключение типа «System.BadImageFormatException» произошло в WindowRecreatorGUI.exe
Дополнительная информация: Была сделана попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B)
Я сделал много изменений в googling и code, и я многому научился, но я просто не могу понять этого. Любые советы будут очень признательны.
Edit: Изменен код и ошибка получила
Edit 2: Я изменил C# программы из любого процессора для x86 конкретно, и теперь я получаю эту ошибку:
необработанного исключения типа " System.EntryPointNotFoundException 'произошел в WindowRecreatorGUI.exe
Дополнительная информация: Не удалось найти точку входа с именем WindowRecreatorCall в DLL' WindowRecreatorDLL.dll '.
И Edit 3 перед сном:
Я добавил экстерном С {} вокруг функции C++. Теперь я получаю эту ошибку:
Управляемый DEBUGGING Помощника 'PInvokeStackImbalance' обнаружил проблему в 'C: \ Users \ Tom \ рабочей \ WindowRecreatorGUI \ WindowRecreatorGUI \ Bin \ x86 \ Debug \ WindowRecreatorGUI.vshost.exe'.
Дополнительная информация: вызов функции PInvoke 'WindowRecreatorGUI! WindowRecreatorGUI.CallWindowRecreator :: WindowRecreatorCall' имеет несбалансированный стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре. Убедитесь, что соглашение о вызове и параметры сигнатуры PInvoke соответствуют целевой неуправляемой подписи.
О, стрелять, хорошо поймать. Хорошо, сделано изменение, и ошибка изменилась! Я отредактировал сообщение, чтобы это отразить. – user2887053
@ user2887053: Проверьте CallingConvention. – SLaks