我正在使用混合应用程序,同时使用托管和安装;原生代码 我想从位于Program.cpp中的Main()函数中调用部署在本机类中的函数,该函数是托管类。
我尝试使用std :: thread但是使用/ cli
失败了我尝试使用Managed System :: Threading :: Thread但失败了,因为我需要在本机类中调用本机函数。
那么我如何在不使用任何第三方的情况下处理事情?
答案 0 :(得分:1)
如果从本机项目开始,则需要执行以下步骤:
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语法的快速介绍。