C# 包装托管代码以供非托管使用 我们有一个大的C++项目,它被编译为本地非托管代码。我们需要使用托管代码中的特性,但我们不想在/clr中编译整个项目

C# 包装托管代码以供非托管使用 我们有一个大的C++项目,它被编译为本地非托管代码。我们需要使用托管代码中的特性,但我们不想在/clr中编译整个项目,c#,c++,architecture,c++-cli,C#,C++,Architecture,C++ Cli,所以我制作了一个DLL,有一个名为B的ref类,它在导出的本机类a中公开。问题是我得到了一个C1190:托管目标代码需要一个“/clr”选项,因为vcclr.h include 我想知道是否有一种方法可以创建某种在非托管方法中包含托管代码的接口 这是我的密码: #pragma once #include "EX_Port.h" #include <vcclr.h> ref class B; class EX_API A { public: A();

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

我想知道是否有一种方法可以创建某种在非托管方法中包含托管代码的接口

这是我的密码:

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

ref class B;

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

    private:
        gcroot<B^> _device;
};
#pragma一次
#包括“EX_Port.h”
#包括
参考B类;
EX_API A类
{
公众:
A();
int DeviceCount();
私人:
gcroot\u设备;
};
我设法通过在cpp中开设新的GCB课程来实现这一目标。但是我有一个本地对象,而我希望它在全局范围内。我刚开始做CLI编程,所以我可能没有注意到一些实践


谢谢

> P>你的大C++程序在加载任何托管代码之前都必须加载和初始化CLR。有几种方法可以做到这一点,从最灵活到最不灵活排列:

  • 它可以使用CLR宿主接口显式加载CLR并执行任意托管代码。这是一个基本的开始,你可以在CodeProject.com这样的网站上找到很多例子

  • 您可以使托管类[ComVisible]。然后,C++代码可以使用标准COM编程技术创建托管类的实例并调用其方法(CONPRORIALIZEX和COCCREATEATION,OY导入指令)。COM管道确保自动加载CLR并加载正确的程序集,无需其他代码即可自行管理该程序集。当您已经在COM中投资时,请考虑这个选项,否则,如果您没有COM的工作知识,您应该考虑一下。

  • 上述两种技术允许执行任何类型的托管代码,而不仅仅是C++/CLI代码。特定于C++/CLI,您可以编写一个自由函数并对其应用_declspec(dllexport)属性。编译器将生成一个输出函数的存根,以便您可以从C++代码调用它的加载库+ GETPROCENT。存根将自动加载CLR。这很容易开始,但非常不灵活,因为您只公开了一个简单的函数,而不是一个类


为托管类创建具有非托管接口的C++/cli库