|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
Доброго. Коллеги, есть 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# сейчас ровно один день. Поиском по форуму прошелся - все слишком сложно. Ткните, будьте ласка, в код с примерами. Можно в книгу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 02:38 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 11:20 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
Arm79 Это? Ошибся немного, не увидел предыдущего вложения Я так понимаю, что библиотека под x86, посмотреть не могу, у меня х64. Может и у вас не идет из-за этого ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 11:31 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
Arm79Arm79 Это? Ошибся немного, не увидел предыдущего вложения Я так понимаю, что библиотека под x86, посмотреть не могу, у меня х64. Может и у вас не идет из-за этого Да если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 12:05 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
UsersДа если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится. причем здесь режим компиляции? У вас нативная библиотка, которая, очевидно, не дружит с самой операционкой Попробуйте проект на 32 разр операционной системе Вот вьюер тоже красным мне отражает, что есть проблемы: ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 12:10 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
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 комментарии и сделал отступы. Это означает что в твоем коде надо будет немного другие имена использовать, но это мелочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 13:24 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
Arm79UsersДа если бы... У меня тоже 64, но режим "комплировать под x86" я поставил. Ей, похоже, именно строка не нравится. причем здесь режим компиляции? У вас нативная библиотка, которая, очевидно, не дружит с самой операционкой Попробуйте проект на 32 разр операционной системе Вот вьюер тоже красным мне отражает, что есть проблемы: Попробовал, осталась та же ошибка. Не в этом дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 22:43 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
bazileПо моему проблема возникает из-за неправильного calling convention. На моей Win7 x64 прроблема исчезла когда я добавил CallingConvention = CallingConvention.Cdecl к объявлению функции LoadMcr(). Скорее всего это нужно сделать для всех фукнкций. Нужно только убедиться что это будет работать как на x86 так и на x64. http://www.sql.ru/forum/actualfile.aspx?id=13413972] Приложенный файл (Mcr.cs - 6Kb) Вот, а это совсем другое дело! Как именно, говоришь, надо все допилить? Благодетель! А если б еще и примеры вызова, тогда, думаю, благодарность народа не имела бы никаких границ. Я это творение в открытый доступ хочу выложить. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 23:06 |
|
Преобразование данных в unsafe - чайниковское
|
|||
---|---|---|---|
#18+
UsersКак именно, говоришь, надо все допилить? Найти все DllImport и добавить текст ", CallingConvention = CallingConvention.Cdecl" перед ")]" Код: c# 1. 2. 3. 4. 5.
UsersА если б еще и примеры вызова Это к автору библотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2012, 00:28 |
|
|
start [/forum/topic.php?fid=20&msg=38024763&tid=1405712]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 169ms |
0 / 0 |