gpt4 book ai didi

header - c++/cli接口(interface)头文件

转载 作者:行者123 更新时间:2023-12-04 12:36:05 25 4
gpt4 key购买 nike

我有一个 C++ 项目(visual studio 2010),它也包含 native 代码和 c++/cli 代码。我不能用/clr 编译整个项目,所以我只为各自的 c++/cli 文件编译。我的问题是头文件不能用/clr 编译,但我想让一些 c++/cli 函数在整个项目中可重用,因此在头文件中定义方法原型(prototype)以将其包含在我需要的每个文件中。有解决办法吗?我试图在头文件中定义一些混合代码方法原型(prototype),但必须打开/clr 才能编译。

这是我的例子:

测试.h

#include <Windows.h>
#include <vector>
#include <string>

using std::vector;
using std::string;

#include <msclr/marshal.h>

#pragma managed

using namespace msclr::interop;
using namespace System;
using namespace System::IO;
using namespace System::Runtime::InteropServices;

public ref class Test
{
public:
int Foo();
};

测试.cpp
#include "Test.h"

int Test::Foo()
{
return 4;
}

Intellisense 提示 Test.h 中的错误,例如必须启用 c++/cli 才能使用#using。但我认为这可以忽略不计,无论如何它都会编译。

编译因链接器错误而中止(对不起,我有德语 VS 版本)
Fehler  6   error LNK1255: Fehler bei Verknüpfung aufgrund von Metadatenfehlern.    
Fehler 4 error LNK2022: Fehler bei Metadatenoperation (8013118D) : Duplizierte Typen (_PROPSHEETPAGEA) wurden gefunden, aber die Typenlayoutinformationen sind nicht konsistent: (0x02000198).
Fehler 5 error LNK2022: Fehler bei Metadatenoperation (8013118D) : Duplizierte Typen (_PROPSHEETPAGEW) wurden gefunden, aber die Typenlayoutinformationen sind nicht konsistent: (0x020001d1).

我在其他地方肯定没有重复的“测试”类,所以我不知道重复来自哪里。什么是类型布局信息,为什么它们不一致?

最佳答案

我想你们都错过了重点。

您可以使用一些/clr 类轻松编译 native 项目。 (例如:原生 DLL 仍然可以像原生 DLL 一样运行,但是,它也可以加载到 C# 中,然后可以在 C# 中访问它的/clr 编译类。)

这就是文件级别存在这样一个选项的原因。 (右键.cpp:属性->C\C++->公共(public)语言运行时支持-/clr)

问题是:

在本地\托管类之间进行通信,因为 .H 文件不能设置为使用/clr,所以这些文件不能用于引用其他地方的托管类,包括同一项目中的其他/clr 文件。 (即,您可以创建/clr 文件,但是它们不能相互通信,也不能在项目的 native 部分中引用它们。)

我能找到的最佳解决方案是创建一个“胶水”C# .dll 文件。

创建一个新的 C# 类库,添加 Native DLL 作为引用,然后编译。

现在,在您的 native 项目中,您可以加载 C# DLL,并通过它访问 native /clr 内容。 (您以这种方式引用的托管代码可以与 native \托管代码一起使用。)

这是很有可能的,但是,我找不到一个简单的方法来实现这一点。

这就是主题的内容,由于在文件级别设置/clr 时头文件不起作用,似乎无法引用/clr 类。 (即,除非整个项目设置为/clr,否则 header 不能包含/clr 代码。)

必须有一种方法可以在没有标题的情况下引用/clr 的东西,或者 C++\CLI 刚刚损坏,我可以使用 pragma + headers 轻松地将 native 代码加载到/clr 文件中,但是,如果没有我的“胶水”,相反的情况看起来是不可能的解决方案。

这就是我认为这个话题的主题。

我的方法有效,但是要正确处理非常棘手,并且由于循环依赖等原因,编译很痛苦。

我真的希望有一种正确的方法来做到这一点,我一直在寻找,我的搜索把我带到了这里......

真正的解决方案是让 .h 文件支持/clr,然后您可以在 header 中定义您的托管类,并能够使用标准方法(如 include\using\pragma 等)自由引用它。

关于header - c++/cli接口(interface)头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8491317/

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