我们有一个很大的C ++项目,它被编译为本机非托管代码。我们需要使用托管代码中的一个功能,但我们不想在/ clr。
中编译整个项目所以我创建了一个DLL,有一个名为B的ref类,它在导出的本机类A中公开。问题是我得到了一个C1190:由于vcclr.h包含,托管目标代码需要'/ clr'选项。
我想知道是否有办法创建某种在非托管方法中拥有托管代码的界面。
这是我的代码:
#pragma once
#include "EX_Port.h"
#include <vcclr.h>
ref class B;
class EX_API A
{
public:
A();
int DeviceCount();
private:
gcroot<B^> _device;
};
我设法通过gcnew使cpp内的B类工作。但是我有一个本地对象,而我想在全球范围内拥有它。我刚刚开始进行CLI编程,所以我可能不了解一些实践。
由于
答案 0 :(得分:6)
您的大型C ++程序必须在执行任何托管代码之前加载并初始化CLR。有几种方法可以做到这一点,从最灵活到最不排名:
它可以使用CLR托管接口显式加载CLR并执行任意托管代码。基本的启动是这个MSDN page以及您可以在CodeProject.com等网站上找到的许多示例
您可以制作托管类[ComVisible]。然后,您的C ++代码可以使用标准COM编程技术来创建托管类的实例并调用其方法(CoInitializeEx和CoCreateInstance,#import指令)。 COM管道确保CLR自动加载并加载正确的程序集,不需要额外的代码来自行管理。当你已经投资COM时,请考虑这个选项,否则如果你没有COM的工作知识就应该考虑这个问题。
上述两种技术允许执行任何类型的托管代码,而不仅仅是C ++ / CLI代码。特定于C ++ / CLI,您可以编写一个自由函数并将__declspec(dllexport)属性应用于它。编译器将生成一个导出该函数的存根,以便您可以使用LoadLibrary + GetProcAddress从C ++代码中调用它。存根自动加载CLR。这很容易上手但是非常不灵活,因为你只是暴露了一个简单的函数,而不是一个类。