2011-12-13 69 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等。