2012-03-30 129 views
3

我们有一个很大的C++项目,它被编译为本机非托管代码。我们需要使用托管代码中的功能,但我们不想在/ clr中编译整个项目。为非托管使用包装托管代码

所以我做了一个DLL,有一个名为B的ref类,它在导出的本机类A中公开。问题是我得到一个C1190:托管的目标代码需要'/ clr'选项,因为vcclr.h包括。

我想知道是否有一种方法来创建某种类型的接口,该接口将在非托管方法中托管代码。

这里是我的代码:

#pragma once 
#include "EX_Port.h" 
#include <vcclr.h> 

ref class B; 

class EX_API A 
{ 
    public: 
     A();   
     int DeviceCount(); 

    private: 
     gcroot<B^> _device; 
}; 

我设法让一个cpp中gcnew的B级工作。但是,我有一个本地对象,而我想在全球范围内使用它。我刚开始做CLI编程,所以我可能不知道一些做法。

感谢

+0

使托管类具有非托管接口的C++/cli库 – 2012-03-30 14:21:58

回答

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。这很容易,但是非常不灵活,因为你只展示一个简单的功能而不是一个类。