2013-12-08 3 views
0

Я провел много поиска и тестирования, и я не смог заставить это работать правильно. Я использую 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 соответствуют целевой неуправляемой подписи.

ответ

1

Ваш собственный метод принимает указатель на структуру.

В C#, который становится ref параметр:

[DllImport("WindowRecreatorDLL.dll", EntryPoint = "WindowRecreatorCall", CharSet = CharSet.Unicode)] 
public static extern void WindowRecreatorCall(ref runDetails runDetails); 

Вы также должны пройти в атрибуте, который, вероятно Cdecl правильный CallingConvention.

+0

О, стрелять, хорошо поймать. Хорошо, сделано изменение, и ошибка изменилась! Я отредактировал сообщение, чтобы это отразить. – user2887053

+0

@ user2887053: Проверьте CallingConvention. – SLaks

Смежные вопросы