Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Импорт Dll с возвратом массива 
:(
    Опции темы
War_Chief
Дата 7.4.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



Доброго всем времени суток.
Проблемка в следующем:
Есть ф-ция в библиотеке написаной на delphi
Код

type Mas=array of integer;
function MyFunc(num1,num2:Integer):Mas;
stdcall;
begin
SetLength(Result,2);
Result[0]:=num1+num2;
Result[1]:=num1*num2;
end;

Exports MyFunc INDEX 1 Name 'MathFunc';


Вызывать нужно из C#, пробывал так:
Код

        [DllImport("dllproj.dll")]
        [return: MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public static extern int[] MathFunc(int num1, int num2); 


        private void button1_Click(object sender, EventArgs e)
        { 
             int[] mas= MathFunc(5, 5);
             textBox1.Text = "+ =" + mas[0].ToString() + "    *= " + mas[1].ToString();
        }


Пишет вот такую ошибку:
Error    1    Error emitting 'System.Runtime.InteropServices.MarshalAsAttribute' attribute -- 'Specified unmanaged type is only valid on fields.

Помогите плиз....

PM MAIL ICQ   Вверх
Partizan
Дата 7.4.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



War_Chief, атрибут MarshalAs можно применять только к полям


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
War_Chief
Дата 7.4.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



Хорошо, но вопрос остается, как вытащить ету ф-цию из Dll, что бы она вернула массив?
PM MAIL ICQ   Вверх
Partizan
Дата 7.4.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



War_Chief, а попробуйте атрибут, содержащий MarshalAs убрать...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
War_Chief
Дата 7.4.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



Пробывал, тогда получается Exception : Cannot marshal 'return value': Invalid managed/unmanaged type combination.

Также были попытки получить через IntPtr
Код

       [DllImport("dllproj.dll")]
       // [return: MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public static extern IntPtr MathFunc(int num1, int num2);

        

        private void button1_Click(object sender, EventArgs e)
        { 
             IntPtr mas= MathFunc(5, 5);
             unsafe
             {
                 int* ms = (int*)mas;
                 textBox1.Text = "+ =" + ms[0].ToString() + "    *= " + ms[1].ToString();
             }
        }


В итоге вот ето...
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
PM MAIL ICQ   Вверх
Rififi
Дата 7.4.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 5
Всего: 36



array of integer
что из себя представляет эта хрень?
возможно какая-то сложная структура данных, про которую C# не в курсе
делай "по нашему", по C++'ному smile - аллокация блока памяти, запись туда integer'ов, возвращение поинтера

в C# данные выковыриваешь через класс Marshal
PM MAIL   Вверх
War_Chief
  Дата 7.4.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



Да я б с радостью, я Delphi сам не люблю, но просто будет набор DLL написаных не мной, именно на Delphi, и некоторые методы будут возвращать массивы((((
Поэтому позарез нужно узнать как вытащить все это на C#
Цитата

array of integer
что из себя представляет эта хрень?
возможно какая-то сложная структура данных, про которую C# не в курсе


Насколько я помню из паскаля, ето тот же масив integer значений.
Тоесть для шарпа ето должно выглядеть как int[]....
Цитата

делай "по нашему", по C++'ному smile - аллокация блока памяти, запись туда integer'ов, возвращение поинтера

Не получится в методах используется именно array of....

Это сообщение отредактировал(а) War_Chief - 7.4.2009, 22:15
PM MAIL ICQ   Вверх
Rififi
Дата 7.4.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 5
Всего: 36



War_Chief
Насколько я помню из паскаля, ето тот же масив integer значений.
Тоесть для шарпа ето должно выглядеть как int[]....

Неа. Это статические массивы (возможно) могут быть таким образом представлены
array[1..10] of integer

а запись array of integer означает динамический массив, и на самом деле ХЗ что там внутри.
моё мнение - с этими "массивами" ты в <censored> (:
PM MAIL   Вверх
War_Chief
Дата 7.4.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 10.7.2007
Где: Украина,Киев

Репутация: нет
Всего: нет



моё мнение - с этими "массивами" ты в <censored> (: 

похоже на то((((
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.