У нас есть библиотека геометрии, которая определяет все объекты геометрии в нашем приложении. Использование может либо создавать объекты геометрии вручную в приложении, либо импортировать геометрию из файлов, например, CSV, KML, GPX и т. д.
Библиотека геометрии изначально была написана на C++. В качестве примера ниже приведен пример класса CPoint
в библиотеке геометрии.
Затем мы начинаем использовать эту библиотеку геометрии в нашем проекте Windows, создавая для нее компонент среды выполнения Windows. По сути, компонент среды выполнения Windows — это просто набор классов-оболочек для исходных классов, написанных на C++. Естественно, мы хотели бы максимально сохранить структуры наследования в C++.
Однако компонент среды выполнения Windows не имеет хорошей поддержки наследования. Далее цитата из Ссылка на классы и структуры (C++/CX)
Однако модель наследования среды выполнения Windows не предназначена для использования в качестве общей модели наследования; в C++/CX это означает, что определяемый пользователем общедоступный класс ссылки не может служить базовым классом.
Однако это одно исключение, которым является Windows::UI::Xaml:DependencyObject. Мы можем определить незапечатанный класс, например MyBase
, который наследуется от DependencyObject, тогда другие классы ссылок могут наследоваться от MyBase
.
И это именно то, что мы сделали, чтобы наследование работало для компонента среды выполнения Windows. И пока кажется, что это единственный способ сделать это.
Наконец, мы начинаем работать над импортом KML. Мы хотим, чтобы важные операции выполнялись в фоновом режиме, что имеет смысл, поскольку эта операция может быть очень медленной в зависимости от размера файла. Все работает нормально, пока я не попытаюсь создать объекты геометрии и сохранить их в базе данных. Я заметил следующее исключение:
Приложение вызвало интерфейс, который был маршалирован для другого потока.
Это связано с тем, что все наши объекты геометрии являются производными от DependencyObject, которые можно использовать только в потоке пользовательского интерфейса. Орз