gpt4 book ai didi

在 visual studio (C++/CLI) 中编译为托管 .NET 的 C++ 代码,否则编译为 native C++

转载 作者:太空宇宙 更新时间:2023-11-04 13:56:40 24 4
gpt4 key购买 nike

我有一个在 Linux 上编译的 C++ 库,我想在 Visual Studio 中编译相同的代码(.NET 兼容代码)。

我已经在 Visual Studio 中成功编译了相同的 native 代码(不涉及图形)。但是,我想向 .NET 公开一些类。我可以为一些非托管类编写一个托管包装器——如果我花我实际上没有的时间。但是,对于一些简单的类,似乎在开头使用指令

#ifdef _MSC_VER
public ref class myclass
#else
class myclass
#endif

可以做到这一点。代码在 visual studio 中按托管方式编译,否则按 native 方式编译。但是,某些涉及指针的类在编译时会返回错误。我知道“*”是非托管指针,“^”是托管指针。我可以定义吗

#ifdef _MSC_VER
#define POINTER ^
#else
#define POINTER *
#endif

这是经常被修改的研究代码。编写包装器将非常耗时,并且每次修改 native 类时还需要修改包装器。因此,我更愿意像上面那样使用条件语句(但我想使用的越少越好)。是否有用于编写在 native C++ 和 C++/CLI 之间最大程度兼容的代码的教程。

提前致谢

最佳答案

C++/CLI ref 指针与 * 指针不同。没有一对一的等价关系。 ref ^ 指针指的是 CLR 中定义的“引用类型”(相对于“值类型”)的对象,它们可以用 gcnew 实例化。 Gcnew 非常重要,因为它告诉编码器要创建的对象正在垃圾回收中,因此这些类型不适用于 native 代码,需要对其进行编码。但是,为了通过引用实际传递一些东西,例如为了能够写回函数中传递的参数,还需要使用 % ... 所以 Form ^ myForm,如果被传递以获取返回值需要写成 Form ^ %myForm。

您最好的做法是编写包装器并使用混合汇编范例。

我不确定来自 Linux C++ 代码,但要从 Windows 中的 go 一词执行此操作,您将创建一个 MFC C++ 库(或可执行文件),然后手动打开公共(public)语言运行时并手动添加一个 AssemblyInfo。 cpp 和 app.manifest 文件到项目。

从那里开始,在您的代码中,有一个 #pragma 用于定义代码的哪些部分。

对于在 native 或托管上下文之外运行的代码,您需要编写:

#pragma unmanaged

它告诉编译将此后的所有内容都视为非托管代码。

为同一文件中的一段代码重新打开托管代码:

#pragma managed

等等,等等。

看起来确实是您可能必须编写包装器的情况。它不必是一个完整的包装器……也许只是一个入口点,用于返回您尝试做的任何事情的最终结果……以及任何需要完成的独特编程,都应该在一个混合程序集二进制文件,.NET 类型仅针对大多数面向目标的任务公开。

关于在 visual studio (C++/CLI) 中编译为托管 .NET 的 C++ 代码,否则编译为 native C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171415/

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