Я создаю C ++ / CLI DLL, которая должна использоваться в качестве оболочки.Цель этого - обернуть C # SDK и представить функции для собственного кода C ++.Я всегда получаю сообщения о том, что я смешиваю типы, и мои операторы использования в управляемых классах помечаются красным, поэтому у меня есть следующее:
#pragma once
#include <iostream>
#include <memory>
#include <string>
namespace TPInterface
{
class ITPFactory
{
public:
static __declspec(dllexport) std::shared_ptr<ITPFactory> CreateTPFactory();
};
}
, который создает экземпляр TPFactory.
#pragma once
#include "ITPSSITotalStation.h"
#include "TPSSITotalStation.h"
#include "ITPFactory.h"
#include <iostream>
#include <memory>
#include <string>
namespace TPInterface
{
class TPFactory : public ITPFactory
{
public:
static std::shared_ptr<SensorSoftwareInterface::TotalStation::ITPSSITotalStation> CreateTPSSITotalStation(std::string pathToDriver);
};
}
И это создает объект TPSSITotalStation, который является интерфейсом ITPSSITotalStation.
TPSSITotalStation
-> TPSSIBase
-> TPBase
и TPSSIBase
, и TPBase
содержат классы (gcroot и header), которые написаны в управляемом коде (ref-классы),
Теперь компилятор говорит мне, что эти классы ref смешаны, недопустимы и так далее.У меня нет проблемы ... Что я делаю не так?
Извините за глупость, я новичок в C ++, пришёл из C #.
Ошибки:
Error 7 error C4368: cannot define 'm_selectedPath' as a member of managed 'TPInterface::Driver': mixed types are not supported
Error 8 error C4368: cannot define 'm_assemblyNameAndVersion' as a member of managed 'TPInterface::Driver': mixed types are not supported
Error 9 error C2678: binary '=' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion)
Error 28 error C3265: cannot declare a managed '_Ptr' in an unmanaged 'std::tr1::_Ptr_base<_Ty>'
Error 51 error C3699: '*' : cannot use this indirection on type 'TPInterface::Sensor'
Error 65 error C3642: 'TPInterface::Sensor msclr::gcroot<T>::operator ->(void) const' : cannot call a function with __clrcall calling convention from native code
Небольшой пример для понимания цели:
ref class Driver // Contains errors in using (C#) statements
{
// Does something managed
private:
std::string m_selectedPath;
std::string m_assemblyNameAndVersion;
}
ref class Sensor // Contains errors in using (C#) statements
{
// Does something managed
}
class TPBase
{
// includes Driver class and holds it also inside msclr::gcroot<Driver^>
}
class TPSSIBase : TPBase
{
// includes Sensor and Driver class and holds sensor also inside msclr::gcroot<Sensor^>
}
class TPSSITotalStation : TPSSIBase, public ITPSSITotalStation
{
// contains functions which should be exported to native C++
}
Остальное уже указано выше.