2011-12-13 24 views
7

我有一个C++项目(visual studio 2010),它也包含本机代码和C++/cli代码。我不能用/ clr编译整个项目,所以我只是为相应的C++/cli文件做这件事。我的问题是头文件不能用/ clr编译,但是我想在整个项目中重新使用一些C++/cli函数,因此在头文件中定义方法原型以将其包含在每个需要它的文件中。有解决方案吗?我试图在头文件中定义一些混合代码方法原型,但必须打开/ clr才能编译。C++/cli接口头文件

这是我的例子:

Test.h

​​

Test.cpp的

#include "Test.h" 

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

智能感知与误差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). 

我绝对没有一个重复类“测试”别处中止,所以我不知道在哪里重复从何而来。什么是布局信息以及它们为什么不一致?

+0

如何用/ clr编译部分项目而不编译?为什么你的本地代码不能用于/ clr? – svick

+1

它是一个3dsMax插件,用/ clr编译整个项目并不行,我收到了很多错误。 Autodesk推荐的方法是仅编译/ clr的C++/cli代码部分。对于每个.cpp文件,您可以在属性中设置“使用公共语言运行库”。 – Michbeckable

+0

你能发表一个头文件的简洁例子,并使用不能编译的cpp文件吗?另外,头文件是由/ clr cpp和non/clr cpp使用的吗? –

回答

3

我想你们都错了。

您可以使用某些/ clr类轻松编译本机项目。 (例如:一个本地DLL仍然可以像本地DLL那样工作,但是它也可以加载到C#中,然后可以在C#中访问/ clr编译类。)

这就是为什么这样的选项存在于文件级别。 (右键的.cpp:属性 - > C^\ C++ - >公共语言运行库支持 -/CLR)

的问题是:

本地\管理类之间的沟通,因为.h文件不能被设置为使用/ clr,那些不能用于在其他地方引用托管类,包括同一项目中的其他/ clr文件。 (即,您可以创建/ clr文件,但它们不能彼此交谈,也不能在项目的本机部分中引用它们。)

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

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

现在,在您的本地项目中,您可以加载C#DLL并通过它访问natives/clr内容。 (您以这种方式引用的托管代码可以用于本机\托管代码。)

这很可能,但是,我找不到一种简单的方法来完成此操作。

这就是主题,似乎没有办法引用/ clr类,因为在文件级设置/ clr时头文件不起作用。 (也就是说,除非整体项目设置为/ clr,否则头文件不能包含/ clr代码。)

必须有一种方法来引用/ clr没有标头的东西,或者C++ \ CLI只是坏了,我可以轻松地加载通过使用pragma +头文件将本地代码导入到/ clr文件中,但是,与我的“粘合”解决方案相比,反过来看起来是不可能的。

这就是我相信这个话题是关于。


我的方法可行,但是,这是非常棘手得到的权利,并汇编是一个痛苦由于循环依赖,等等,。

我真的希望有做这样一种合适的方式,我一直在寻找,我的搜索导致我在这里...

真正的解决方案,将是使.h文件支持/ CLR,那么你可以在头文件中定义你的托管类,并且可以使用标准方法自由引用它,如include \ using \ pragma等。