在Mixed App C ++ / cli中使用Thread in从托管类调用本机类中的本机函数

时间:2018-05-08 11:31:03

标签: multithreading c++-cli

我正在使用混合应用程序,同时使用托管和安装;原生代码 我想从位于Program.cpp中的Main()函数中调用部署在本机类中的函数,该函数是托管类。

我尝试使用std :: thread但是使用/ cli

失败了

我尝试使用Managed System :: Threading :: Thread但失败了,因为我需要在本机类中调用本机函数。

那么我如何在不使用任何第三方的情况下处理事情?

1 个答案:

答案 0 :(得分:1)

如果从本机项目开始,则需要执行以下步骤:

  • 选择项目属性并将“无公共语言运行时支持”选项更改为“公共语言运行时支持/ clr”。
  • 从“查看”菜单/“其他Windows”打开“属性管理器”,并在我的系统上将所需的配置(例如:Debug | Win32)添加属性表“C ++公共语言运行时支持” “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来存储本机类。

我发现this答案也很有用,它还为我们提供了对c ++ - cli语法的快速介绍。