2011-12-13 38 views
7

Tôi có một dự án C++ (studio trực quan 2010) bao gồm mã gốc và mã C++/cli. Tôi không thể biên dịch toàn bộ dự án với/clr, vì vậy tôi chỉ làm điều đó cho các tệp C++/cli tương ứng. Vấn đề của tôi là một tập tin header không thể được biên dịch với/clr, nhưng tôi muốn làm cho một số hàm C++/cli có thể tái sử dụng trong toàn bộ dự án và xác định nguyên mẫu phương thức trong một tệp tiêu đề để bao gồm nó trong mọi tệp mà tôi cần nó. Có giải pháp nào không? Tôi đã cố gắng để xác định một số nguyên mẫu phương pháp mã hỗn hợp trong một tập tin tiêu đề, nhưng/clr phải được bật cho rằng để biên dịch.C++/cli header header file

Dưới đây là ví dụ của tôi:

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 đang phàn nàn với sai sót trong Test.h như C++/cli phải được bật để sử dụng #using. Nhưng tôi nghĩ rằng điều này là không đáng kể và nó sẽ biên dịch anyway.

Compilation hủy bỏ với một Lỗi Linker (sry, tôi có Đức phiên bản 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). 

Tôi chắc chắn không có một lớp trùng lặp "Test" ở những nơi khác, vì vậy tôi không biết nơi mà các bản sao đến từ đâu. Thông tin typelayout là gì và tại sao chúng không nhất quán?

+0

Bạn có thể biên dịch một phần dự án bằng/clr và một phần bằng cách nào? Và tại sao mã nguồn gốc của bạn không hoạt động với/clr? – svick

+1

Một plugin của nó cho 3dsMax và biên soạn toàn bộ dự án với/clr doesnt work, tôi nhận được rất nhiều lỗi. Cách được khuyến cáo bởi Autodesk là biên dịch chỉ các phần mã C++/cli với/clr. Đối với mọi tệp .cpp bạn có thể đặt "Sử dụng thời gian chạy ngôn ngữ chung" trong thuộc tính. – Michbeckable

+0

Bạn có thể đăng một ví dụ ngắn gọn về tệp tiêu đề và sử dụng tệp cpp không biên dịch được không? Ngoài ra, là tập tin tiêu đề đang được tiêu thụ bởi cả một/clr cpp và c/non-clr không? –

Trả lời

3

Tôi nghĩ rằng tất cả các bạn đã bỏ lỡ điểm.

Bạn có thể dễ dàng biên dịch một dự án gốc với một số lớp/clr. (Ví dụ: một DLL gốc sẽ vẫn hoạt động như một DLL gốc, tuy nhiên, nó cũng có thể được nạp vào C# và các lớp được biên dịch/clr sau đó có thể được truy cập trong C#.)

Đó là lý do tại sao một tùy chọn như vậy tồn tại mức tệp. (Nhấp chuột phải cpp: Properties-> C \ C++ -> Common Language Runtime Support-/clr)

Vấn đề là:

Giao tiếp giữa các lớp \ quản lý bản xứ, kể từ file .H không thể được thiết lập để sử dụng/clr, chúng không thể được sử dụng để tham khảo một lớp được quản lý ở nơi khác bao gồm các tệp khác/clr trong cùng một dự án. (ví dụ, bạn có thể tạo/tệp clr, nhưng, họ không thể nói chuyện với nhau, cũng như bạn không thể tham khảo chúng trong phần gốc của dự án.)

Giải pháp tốt nhất tôi có thể tìm thấy là tạo ra một "keo "C# .dll tệp.

Tạo thư viện lớp C# mới, thêm DLL gốc làm tham chiếu, sau đó biên dịch.

Bây giờ, trong dự án gốc của bạn, bạn có thể tải C# DLL, và truy cập vào các công cụ bản địa/clr thông qua nó. (Mã được quản lý mà bạn tham chiếu theo cách này có thể được sử dụng với mã \ managed gốc.)

Rất có thể, nhưng, tôi không thể tìm thấy cách đơn giản để thực hiện việc này.

Đó là những gì chủ đề là về, có vẻ như không có cách nào để tham khảo/clr lớp do tệp tiêu đề không hoạt động khi bạn đặt/clr ở cấp tệp. (ví dụ: tiêu đề không thể chứa/mã clr trừ khi dự án WHOLE được đặt thành/clr.)

Phải có cách để tham chiếu/không có tiêu đề, hoặc C++ \ CLI bị hỏng, tôi có thể tải dễ dàng mã nguồn gốc vào/clr tập tin bằng cách sử dụng pragma + tiêu đề, tuy nhiên, ngược lại là tìm kiếm không thể ngắn của tôi "keo" giải pháp.

Đó là những gì tôi tin rằng chủ đề này là về.


Phương pháp của tôi hoạt động, nhưng rất khó để có được quyền, và biên dịch là một nỗi đau do phụ thuộc vòng tròn, v.v.

Tôi thực sự hy vọng có một cách thích hợp để làm điều này, tôi đã tìm kiếm và tìm kiếm của tôi dẫn tôi đến đây ...

Các giải pháp thực tế, sẽ làm cho .h file hỗ trợ/clr, sau đó bạn có thể định nghĩa lớp được quản lý của bạn trong tiêu đề và có thể tự do tham chiếu nó bằng các phương thức chuẩn, như include \ using \ pragma, v.v.

Các vấn đề liên quan