c# - 包装托管代码以供非托管使用

标签 c# c++ architecture c++-cli

我们有一个编译为 native 非托管代码的大型 C++ 项目。我们需要使用托管代码中的功能,但我们不想在/clr 中编译整个项目。

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

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

这是我的代码:

#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 编程,所以我可能不了解一些做法。

谢谢

最佳答案

您的大型 C++ 程序必须先加载和初始化 CLR,然后才能执行任何托管代码。有几种方法可以做到这一点,从最灵活到最不灵活:

  • 它可以使用 CLR 托管接口(interface)显式加载 CLR 并执行任意托管代码。基本的启动器是这个MSDN page以及您可以在 CodeProject.com 等网站上找到的许多示例

  • 您可以使托管类 [ComVisible]。然后,您的 C++ 代码可以使用标准 COM 编程技术来创建托管类的实例并调用其方法(CoInitializeEx 和 CoCreateInstance,#import 指令)。 COM 管道确保 CLR 自动加载并加载正确的程序集,不需要额外的代码来自行管理。如果您已经对 COM 进行了投资,请考虑此选项;如果您没有 COM 的应用知识,则不应考虑其他选项。

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

关于c# - 包装托管代码以供非托管使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944539/

相关文章:

c# - 批量重构 C#

c# - Linq to XML查询问题

c++ - Boost模板派生类的序列化

c++ - 如何检查字符串是否包含所有这些 : digits, 字母和特殊字符?

c++ - 为什么我无法创建流迭代器?

java - 在 JVM 关闭时触发 AutoClosable

c# - 您如何正确处理 Entity Framework Core 中的 SQL_VARIANT?

c# - 解析用户的查询

design-patterns - 具有粒度方法和属性访问的编程语言

architecture - 领域驱动设计中的层