Товарищи, понадобилось обернуть CLI'ем некоторый код на плюсах и отдать либу на использование в дотнете. Не ругайте строго если вопрос тривиальный, первый раз таким занимаюсь.
Собственно есть у нас два класса unmanaged.
C++ (Qt)
class GeoPoint
{
public:
GeoPoint(double latitude = 0.0, double longtitude = 0.0) :
_latitude(latitude), _longtitude(longtitude) {}
double latitude() const {return _latitude;}
double longtitude() const {return _longtitude;}
private:
double _latitude;
double _longtitude;
};
class GeoSquare
{
public:
GeoSquare (GeoPoint topLeft = GeoPoint(), GeoPoint topRight = GeoPoint(), GeoPoint bottomLeft = GeoPoint(), GeoPoint bottomRight = GeoPoint())
: _topLeft(topLeft), _topRight(topRight), _bottomLeft(bottomLeft), _bottomRight(bottomRight) {}
GeoPoint topLeft() const {return _topLeft;}
GeoPoint topRight() const {return _topRight;}
GeoPoint bottomLeft() const {return _bottomLeft;}
GeoPoint bottomRight() const {return _bottomRight;}
private:
GeoPoint _topLeft;
GeoPoint _topRight;
GeoPoint _bottomLeft;
GeoPoint _bottomRight;
};
Теперь оборачиваем их.
C++ (Qt)
//Wrapper
namespace GeoDll
{
public ref class WrGeoPoint
{
public:
WrGeoPoint(double latitude, double longtitude);
double lattitude();
double longtitude();
private:
GeoPoint *geoPoint;
};
public ref class WrGeoSquare
{
public:
WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight);
WrGeoPoint topLeft();
WrGeoPoint topRight();
WrGeoPoint bottomLeft();
WrGeoPoint bottomRight();
private:
GeoSquare *geoSquare;
};
}
Реализация. Для упрощения geoSquare не инициализируем.
C++ (Qt)
GeoDll::WrGeoPoint::WrGeoPoint(double latitude, double longtitude)
{
geoPoint = new GeoPoint(latitude, longtitude);
}
double GeoDll::WrGeoPoint::lattitude()
{
return geoPoint->latitude();
}
double GeoDll::WrGeoPoint::longtitude()
{
return geoPoint->longtitude();
}
GeoDll::WrGeoSquare::WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight)
{
}
Соберем это всё в dll и подключим в C# проекте.
C#
namespace CS_TEST
{
class Program
{
static void Main(string[] args)
{
//Test GeoPoint
WrGeoPoint point1 = new WrGeoPoint(10.5, 11.6);
double longtitude = point1.longtitude();
double latitude = point1.lattitude();
longtitude = latitude;
WrGeoPoint point2 = new WrGeoPoint(10.5, 11.6);
WrGeoPoint point3 = new WrGeoPoint(11.8, 14.9);
WrGeoPoint point4 = new WrGeoPoint(26.5, 35.8);
WrGeoSquare square = new WrGeoSquare(point1, point2, point3, point4);
}
}
}
На строчке с созданием square получаем ошибку
error CS0570: '.ctor' is not supported by the language
Не могу понять откуда unmanaged торчит неявно?
WrGeoSquare(WrGeoPoint topLeft, WrGeoPoint topRight, WrGeoPoint bottomLeft, WrGeoPoint bottomRight);Здесь? Так нельзя делать? На эту мысль наводит то, что если создание square убрать, то всё работает отлично.
Решил проблему, передавая в конструктор WrGeoSquare указатели CLI.
C++ (Qt)
GeoPointDll::WrGeoSquare::WrGeoSquare(WrGeoPoint^ topLeft, WrGeoPoint^ topRight, WrGeoPoint^ bottomLeft, WrGeoPoint^ bottomRight)
Не разбираюсь в C#, и в голове совсем перепуталось, что указатели, что ссылки.