我有一个C ++项目(visual studio 2010),它包含本机代码和c ++ / cli代码。我无法使用/ clr编译整个项目,所以我只针对各自的c ++ / cli文件进行编译。我的问题是头文件不能用/ clr编译,但我想让一些c ++ / cli函数在整个项目中可重用,因此在头文件中定义方法原型,将其包含在我需要它的每个文件中。有解决方案吗?我试图在头文件中定义一些混合代码方法原型,但必须打开/ clr才能进行编译。
以下是我的例子:
Test.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();
};
Test.cpp的
#include "Test.h"
int Test::Foo()
{
return 4;
}
Intellisense抱怨Test.h中的错误,例如c ++ / cli必须启用才能使用#using。但我认为这可以忽略不计,无论如何都会编译。
编译中止链接器错误(sry,我有德语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).
我绝对没有其他地方的重复课“测试”,所以我不知道副本来自哪里。什么是typelayout信息,为什么它们不一致?
答案 0 :(得分:4)
我认为你们都错过了这一点。
您可以使用某些/ clr类轻松编译本机项目。 (例如:本机DLL仍将像本机DLL一样运行,但是,它也可以加载到C#中,然后可以在C#中访问它的/ clr编译类。)
这就是为什么这样的选项存在于文件级别的原因。 (右键单击.cpp:属性 - > C \ C ++ - &gt;公共语言运行时支持 - / clr)
问题是:
在本机\托管类之间进行通信,因为.H文件不能设置为使用/ clr,这些不能用于引用其他地方的托管类,包括同一项目中的其他/ clr文件。 (也就是说,您可以创建/ clr文件,但是,它们不能相互通信,也不能在项目的原生部分中引用它们。)
我能找到的最佳解决方案是创建一个“胶水”C#.dll文件。
创建一个新的C#类库,添加Native DLL作为参考,然后编译。
现在,在您的本机项目中,您可以加载C#DLL,并通过它访问natives / clr。 (您以这种方式引用的托管代码可以与本机\托管代码一起使用。)
这很可能,但是,我找不到一种直接的方法来实现这一目标。
这就是主题的内容,当你在文件级别设置/ clr时,似乎无法引用/ clr类,因为头文件无法正常工作。 (即,除非将WHOLE项目设置为/ clr,否则标题不能包含/ clr代码。)
必须有一种方法来引用/ clr没有头文件的东西,或者C ++ \ CLI刚刚破解,我可以通过使用pragma +头文件轻松地将本机代码加载到/ clr文件中,但是反过来看起来不可能“胶水”解决方案。
这就是我认为这个话题的内容。
我的方法有效,但是,正确起来非常棘手,并且由于循环依赖等原因,编译很痛苦。
我真的希望有一个合适的方法来做到这一点,我一直在寻找,我的搜索引领我到这里......
真正的解决方案是使.h文件支持/ clr,然后您可以在标头中定义托管类,并能够使用标准方法自由引用它,例如include \ using \ pragma等。
答案 1 :(得分:0)