Здравствуйте, Alexei_z_, Вы писали:
A__>Каков будет аналог данной структуры в C#?
Никаков. В Шарп можн перетащить только POD. Другими словами структуру без метдовов, конструкторов и деструкторов.
A__>Какими должны быть прототипы для вызова в C#?
Ну, примерно:
int f1(ImageResult ref vResults, ref eRotattionType RotType, еще пара параметров);
Только ImageResult тогда должен быть объявлен как класс (хотя зачем там двойная косвенность? Без нее можно было бы структорой обойтись, это было бы эффектинвее). А eRotattionType должен быть описан как енум в шарпе.
A__>Я использую DllImport, есть ли другие способы?
Других способов особо и нет. Разве что сделать обертку на МС++.
... << RSDN@Home 1.1.4 beta 2 >>
Здравствуйте, VladD2, Вы писали:
VD>Ну, примерно:
VD>VD>int f1(ImageResult ref vResults, ref eRotattionType RotType, еще пара параметров);
VD>
Я, наверное, чего-то недопонял, но так я просто передаю ссылку на объект ImageResult.
Кстати, спасибо за информацию по поводу структур, в принципе, в ImageResult можно оставить только простые типы
выглядеть она будет примерно так:
[C#]
[ StructLayout( LayoutKind.Sequential )]
public struct ImageResult
{
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=2 )]
float [] DefAngles;
eRotationType r_type;
bool bFinal;
}
[C++]
struct ImageResult
{
float DefAngles [2];
eRotationType r_type;
bool bFinal;
}
enum объявлен и в шарпе.
struct я хочу использовать, чтобы в C# работать со значениями, а не со ссылками.
Моя задача в следующем: нужно вызывать функцию С++ dll, передавая ей ссылку на вектор (или что-нибудь похожее, нужен массив переменной длиныб могу написать и сам,получится тот же упрощенный вектор, т.е. проблема та же)
Внутри Dll этот массив заполняется (конечный размер из вне заранее неизвестен) и возвращается в C#.
т.е. в C++ dll прототип функции
funcCPP(vector<ImageResult>&vresults)
как вызвать эту функцию из Dll С++ средствами C#?
Заранее спасибо за помощь
Здравствуйте, 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 >>