gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:29:25 26 4
gpt4 key购买 nike

我们有一个编译为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com