Использование Thread в смешанном приложении C ++ / cli для вызова нативной функции в нативном классе из управляемого класса - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над смешанным приложением, используя как управляемые, так и собственные коды Я хочу вызвать функцию, развернутую в собственном классе, из функции Main (), расположенной в Program.cpp, который является управляемым классом.

Я пытался использовать std :: thread, но потерпел неудачу с / cli

Я пытался использовать Managed System :: Threading :: Thread, но не смог, потому что мне нужно вызвать нативную функцию в нативном классе.

Так, как я могу справиться с вещами без использования каких-либо сторонних?

1 Ответ

0 голосов
/ 08 мая 2018

Если вы начинаете с собственного проекта, вам нужно выполнить следующие шаги:

  • Выберите свойства проекта и измените параметр «Нет поддержки общего языка во время выполнения» на «Поддержка общего языка во время выполнения /clr".
  • Откройте «Диспетчер свойств» из меню «Вид» / «Другие окна» и добавьте страницу свойств «Поддержка общеязыкового языка C ++» в нужную конфигурацию (например: Отладка | Win32) в моей системе, под которой находится этот лист "C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V140". Я использую файл «Microsoft.Cpp.ManagedExtensions.props».
    • Вам необходимо полностью удалить std :: thread.

headerish:

#pragma once
#include<stddef.h>

using namespace System;
using namespace System::Threading;

namespace FooSpace
{
    // Native stuff 
    public class Native
    {
    public:
        static void Foo() { }
        void Bar() {
        }
    };

    // Managed stuff
    public ref class Managed
    {
    private:
        Native* m_Native;

    public:
        Managed()
        {
            m_Native = new Native();
        }

        ~Managed()
        {
            if (NULL != m_Native)
            {
                delete m_Native;
                m_Native = NULL;
            }
        }

        void Bar()
        {
            m_Native->Bar();
        }

        static void ThreadCall(Object^ o)
        {
            auto me = (Managed^)o;
            me->Bar(); // Call a method of an instance of the native class
            Native::Foo(); // Call a static method of the Native class
        }

        void StartThread()
        {
            auto t = gcnew Thread(gcnew ParameterizedThreadStart(ThreadCall));
            t->Start(this);
            t->Join();
        }
    };
}

файл soure:

#include "stdafx.h"
#include "CppCli_Native.h"

using namespace FooSpace;

int main()
{
    Native::Foo(); // call native static method
    auto native = new Native(); // create native instance
    native->Bar(); // call native method

    auto managed = gcnew Managed();
    managed->Bar(); // This will call bar
    managed->StartThread(); // This will start a thread
    delete managed;

    Console::ReadLine();
    return 0;

}

Редактировать: Оказывается, вам не нужно использовать IntPtr для хранения нативного класса.

Я считаю этот ответ также полезным, он также дает нам быстрое введение в синтаксис c ++ - cli.

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