Что вызывает «WrongThreadException» в Unity 3D? - PullRequest
2 голосов
/ 19 февраля 2020

Я хочу интегрировать проект C ++ в Unity. Unity предоставляет механизм под названием I2 CPP (Intermediate Language To C ++), который позволяет добавлять код C ++ в ваш проект Unity. Я создал простой класс C ++ и заголовок в проекте «Пустое приложение (Universal Windows C ++ / CX)» в Visual Studio.

// header
namespace SomeNamespace {
    public ref class MyRuntimeClass sealed
    {
        public:
            // Constructor
            MyRuntimeClass();

            // Method to check if initialized
            bool IsClassInitialized();

        private:
            bool _isRuntimeInitialized = false;
    };
} 

и

// implementation
using SomeNamespace;
MyRuntimeClass::MyRuntimeClass()
{
    _isRuntimeInitialized = true;
}

bool MyRuntimeClass::IsClassInitialized()
{
    return _isRuntimeInitialized;
};

I В Unity сделали простой проект и внесли необходимые изменения в настройки проигрывателя, указанные в документации. Я также добавил куб в качестве игрового объекта и прикрепил к кубу скрипт, который использует мой код C ++, т.е.

#if ENABLE_WINMD_SUPPORT
using SomeNamespace;
#endif

public class RuntimeSampleUnity : MonoBehaviour
{
#if ENABLE_WINMD_SUPPORT
    private MyRuntimeClass _myRuntimeClass;
#endif

    // Default MonoBehaviour method
    void Start()
    {
#if ENABLE_WINMD_SUPPORT
        // New instance of runtime class
        _myRuntimeClass = new MyRuntimeClass();

        // Check to see if we initialized C++ runtime component
        var isInit = _myRuntimeClass.IsClassInitialized();
        Debug.LogFormat("MyRuntimeClass: {0}", isInit);
#endif
    }
}

На последнем шаге я добавил файл winmd из проекта C ++ в свой активы в Unity. Проект работает нормально, но когда я запускаю проект, я получаю Platform.WrongThreadException: The application called an interface that was marshalled for a different thread. Что вызывает это исключение (и как я могу это исправить)?

РЕДАКТИРОВАТЬ: Чтобы немного пояснить, почему я делаю то, что я делаю: Microsoft предоставляет проект , который показывает, как интегрировать OpenCV (C ++) в проекты на основе HoloLens. Хотя он предоставляет проект UWP, который смешивает OpenCV и C#, он не показывает, как интегрировать этот конкретный проект в Unity. Кто-то действительно сделал это возможным через I2 CPP. Хотя я столкнулся с проблемами при использовании его проекта на основе Visual Studio 2017 в Visual Studio 2019, я попытался сделать минимальный пример, чтобы понять, как он (в основном) работает.

1 Ответ

4 голосов
/ 19 февраля 2020

Я думаю, что вы неправильно понимаете концепцию IL2 CPP.

IL2 CPP (Intermediate Language To C ++) - разработанного Unity скриптового бэкэнда, который вы можете использовать в качестве альтернативы. Моно при создании проектов для различных платформ. При создании проекта с использованием IL2 CPP, Unity преобразует код IL из сценариев и сборок в C ++ перед созданием собственного двоичного файла (например, .exe, apk, .xap) для выбранной вами платформы. Некоторые из применений для IL2 CPP включают повышение производительности, безопасности и совместимости платформ ваших проектов Unity.

Чтобы использовать C ++, вы должны написать Native Plugin .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...