Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование данных в unsafe - чайниковское / 10 сообщений из 10, страница 1 из 1
02.11.2012, 02:38
    #38022643
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
Доброго.

Коллеги, есть dll для работы с текстами.

Есть класс для работы с ней на c#. В приложенном файле.

[DllImport("mcr.dll", CharSet = CharSet.None)]
public static extern int InitMcr();

// // LoadMcr - загрузить словарь mcr

[DllImport("mcr.dll", CharSet = CharSet.None)]
public static extern int LoadMcr([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string s);

суть проблемы: как только я вызываю:
LoadMcr("zal.mcr").

Получаю ошибку: PInvokeStackImbalance was detected
Message: A call to PInvoke function 'Test!MCRClacc.Mcr::LoadMcr' 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.

Понятно, что ей нужно преобразование. Понятно, что копать надо где-то в сторону маршаллинга и т.п. Увы, мой уровень работы с c# сейчас ровно один день. Поиском по форуму прошелся - все слишком сложно. Ткните, будьте ласка, в код с примерами.
Можно в книгу.
...
Рейтинг: 0 / 0
02.11.2012, 11:20
    #38022965
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
...
Рейтинг: 0 / 0
02.11.2012, 11:31
    #38023004
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
Arm79 Это?

Ошибся немного, не увидел предыдущего вложения
Я так понимаю, что библиотека под x86, посмотреть не могу, у меня х64.
Может и у вас не идет из-за этого
...
Рейтинг: 0 / 0
02.11.2012, 12:05
    #38023095
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
Arm79Arm79 Это?

Ошибся немного, не увидел предыдущего вложения
Я так понимаю, что библиотека под x86, посмотреть не могу, у меня х64.
Может и у вас не идет из-за этого


Да если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится.
...
Рейтинг: 0 / 0
02.11.2012, 12:10
    #38023117
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
UsersДа если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится.

причем здесь режим компиляции? У вас нативная библиотка, которая, очевидно, не дружит с самой операционкой
Попробуйте проект на 32 разр операционной системе

Вот вьюер тоже красным мне отражает, что есть проблемы:
...
Рейтинг: 0 / 0
02.11.2012, 13:24
    #38023279
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
UsersПолучаю ошибку: PInvokeStackImbalance was detected
Message: A call to PInvoke function 'Test!MCRClacc.Mcr::LoadMcr' 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.
По моему проблема возникает из-за неправильного calling convention. На моей Win7 x64 прроблема исчезла когда я добавил CallingConvention = CallingConvention.Cdecl к объявлению функции LoadMcr(). Скорее всего это нужно сделать для всех фукнкций. Нужно только убедиться что это будет работать как на x86 так и на x64.

Смотри приаттаченный файл с исправлением. Я его переделал немного - вынес структуры из класса, переименовал пространтство имен, разделил классы, переделал комментарии в xml комментарии и сделал отступы. Это означает что в твоем коде надо будет немного другие имена использовать, но это мелочь.
...
Рейтинг: 0 / 0
02.11.2012, 22:43
    #38024116
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
Arm79UsersДа если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится.

причем здесь режим компиляции? У вас нативная библиотка, которая, очевидно, не дружит с самой операционкой
Попробуйте проект на 32 разр операционной системе

Вот вьюер тоже красным мне отражает, что есть проблемы:


Попробовал, осталась та же ошибка. Не в этом дело.
...
Рейтинг: 0 / 0
02.11.2012, 23:06
    #38024131
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
bazileПо моему проблема возникает из-за неправильного calling convention. На моей Win7 x64 прроблема исчезла когда я добавил CallingConvention = CallingConvention.Cdecl к объявлению функции LoadMcr(). Скорее всего это нужно сделать для всех фукнкций. Нужно только убедиться что это будет работать как на x86 так и на x64.
http://www.sql.ru/forum/actualfile.aspx?id=13413972] Приложенный файл (Mcr.cs - 6Kb)

Вот, а это совсем другое дело! Как именно, говоришь, надо все допилить? Благодетель!

А если б еще и примеры вызова, тогда, думаю, благодарность народа не имела бы никаких границ.
Я это творение в открытый доступ хочу выложить.
...
Рейтинг: 0 / 0
03.11.2012, 00:28
    #38024184
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
UsersКак именно, говоришь, надо все допилить?
Найти все DllImport и добавить текст ", CallingConvention = CallingConvention.Cdecl" перед ")]"
Код: c#
1.
2.
3.
4.
5.
// Было
[DllImport("mcr.dll", CharSet = CharSet.None)]

// Стало
[DllImport("mcr.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]



UsersА если б еще и примеры вызова
Это к автору библотеки.
...
Рейтинг: 0 / 0
04.11.2012, 00:12
    #38024763
Users
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование данных в unsafe - чайниковское
bazile,

Он си шарп не умеет, только с++.

Ладно, в любом случае - спасибо огромное даже за то, что уже сделано.
Но если вдруг решишь продолжить - буду только рад.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование данных в unsafe - чайниковское / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]