C ++ / CLI смешанная управляемая / нативная DLL не будет работать - PullRequest
0 голосов
/ 20 сентября 2018

Я создаю 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++ 
}

Остальное уже указано выше.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Поскольку std::string является неуправляемым типом, а ref class Driver является управляемым классом, вы не можете определить поле с неуправляемым типом внутри управляемого класса.

Если вы хотите определить строковое поле, используйте System.String^ вместо.

0 голосов
/ 20 сентября 2018
  1. Вы не можете получить неуправляемый класс из управляемого класса.
  2. Вы не можете получить управляемый класс из неуправляемого класса.
  3. Нельзя добавлять управляемых членов в неуправляемые классы
  4. Нельзя добавлять неуправляемые члены данных (кроме указателей) в управляемый класс.
  5. В неуправляемом классе выможет писать функции, которые возвращают управляемые типы.
  6. В управляемом классе вы можете формировать только функции, которые используют разрешенные управляемые типы.

Что делать, чтобы создать оболочку:

  1. Создайте неуправляемый класс, содержащий gcroot<..> указатель / объекты для всех управляемых объектов, которые необходимо создать, создать и удерживать.Посмотрите в документации по шаблону gcroot<..>.
  2. В управляемом классе вы можете держать указатели на неуправляемый мир.

Пока вы используете gcroot и обычные указатели, вы можете легко получить доступ к миру .NET из неуправляемого мира и наоборот.

...