Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Импорт Dll с возвратом массива


Автор: War_Chief 7.4.2009, 19:57
Доброго всем времени суток.
Проблемка в следующем:
Есть ф-ция в библиотеке написаной на 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.

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

Автор: Partizan 7.4.2009, 20:33
War_Chief, атрибут MarshalAs можно применять только к полям

Автор: War_Chief 7.4.2009, 20:47
Хорошо, но вопрос остается, как вытащить ету ф-цию из Dll, что бы она вернула массив?

Автор: Partizan 7.4.2009, 21:11
War_Chief, а попробуйте атрибут, содержащий MarshalAs убрать...

Автор: War_Chief 7.4.2009, 21:30
Пробывал, тогда получается 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.

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

в C# данные выковыриваешь через класс Marshal

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

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


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

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

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

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

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

а запись array of integer означает динамический массив, и на самом деле ХЗ что там внутри.
моё мнение - с этими "массивами" ты в <censored> (:

Автор: War_Chief 7.4.2009, 22:41
моё мнение - с этими "массивами" ты в <censored> (: 

похоже на то((((

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)