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

Коллеги, есть 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
Преобразование данных в unsafe - чайниковское
    #38022965
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Преобразование данных в unsafe - чайниковское
    #38023004
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79 Это?

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

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


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

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

Вот вьюер тоже красным мне отражает, что есть проблемы:
...
Рейтинг: 0 / 0
Преобразование данных в unsafe - чайниковское
    #38023279
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование данных в unsafe - чайниковское
    #38024116
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79UsersДа если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится.

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

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


Попробовал, осталась та же ошибка. Не в этом дело.
...
Рейтинг: 0 / 0
Преобразование данных в unsafe - чайниковское
    #38024131
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование данных в unsafe - чайниковское
    #38024184
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Преобразование данных в unsafe - чайниковское
    #38024763
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

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

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


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