Re[3]: оболочка для C++ dll в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.04 19:11
Оценка:
Здравствуйте, Alexei_z_, Вы писали:

Ты бы пользовался тегами форматирования. А то читать неформатированный код очень не просто.

A__>Я, наверное, чего-то недопонял, но так я просто передаю ссылку на объект ImageResult.


У тебя двойная косвенность была в примере. Ее можно добиться только если объявить в Шарпе тип как класс. Но, думаю, проще устранить эту двойную косвенность. Одного указателя тебе более чем достаточно, а это обычным ref-ом описывается.

A__>Кстати, спасибо за информацию по поводу структур, в принципе, в ImageResult можно оставить только простые типы

A__>выглядеть она будет примерно так:
A__>[ StructLayout( LayoutKind.Sequential )]
A__>public struct ImageResult
A__>{
A__>     [ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )]
A__>    float [] DefAngles;
A__>    eRotationType r_type;
A__>    bool bFinal;
A__>}


Тэги должны быть открывающеми и закрывающими.

Вот такую структуру уже без проблем интероп съест.

A__>Моя задача в следующем: нужно вызывать функцию С++ dll, передавая ей ссылку на вектор (или что-нибудь похожее, нужен массив переменной длиныб могу написать и сам,получится тот же упрощенный вектор, т.е. проблема та же)


Передовать нужно ссылку на обычный массив и его длинну. Длинна может быть передана в качестве параметра или как поле структуры в которую вложен массив. Классы С++ передават в Шарп нельзя.

A__>Внутри Dll этот массив заполняется (конечный размер из вне заранее неизвестен) и возвращается в C#.


Ну, вот и передавай массив своих стуктур. Только не делай лишней косвенности. Просто передавай указатель на структуру или xxx[], а в Шарпе описывай это как массив (обычный, не динамический). А длинную передавай через отдельный парамерт и с помощью атрибутов укажи ее интеропу.

A__>т.е. в C++ dll прототип функции

A__>funcCPP(vector<ImageResult>&vresults)

A__>как вызвать эту функцию из Dll С++ средствами C#?


Такую не как. Сделай просто:
funcCPP(int * len, ImageResult * pImageResult);


Тогда в шарпе она будет выглядеть так:
funcCPP(out int len, out ImageResult imageResult);


Ну, и атрибутами там нужно будет пометить что len — это длина. Тольк как с атрибутами я на память не скжу. Рой сам в МСДН.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.