2010-10-23 56 views
8

Như trong câu hỏi Creating simple c++.net wrapper. Step-by-stepLiên kết không được quản lý C++ DLL với quản lý C++ lớp thư viện DLL

Tôi Tring để sử dụng lớp C++ trong .NET nhưng tôi đang gặp vấn đề về xây dựng trong Visual Studio (2008).

Tôi có lớp không được quản lý A (C++ được biên dịch bằng/clr). Tôi đã tạo một lớp C++/clr 'Class1' kết thúc tốt đẹp A và với phương thức phù hợp với các phương thức của A.

Nếu tôi bao gồm hạng A của tập tin nguồn đơn vị trong thư viện lớp dự án cho Class1 (quản lý) Tôi không có vấn đề liên kết tất cả mọi thứ và hoạt động tốt, Nhưng tôi có nhiều không được quản lý C++ lớp như A và Tôi Tring đặt chúng trong một DLL và liên kết DLL đó đến thư viện được quản lý (của trình bao bọc lớp). [Tôi thực sự không thấy cần phải liên kết các DLL của nhau vào thời điểm này, nhưng trình biên dịch dường như đòi hỏi nó, đem lại cho các lỗi tương tự hình dưới đây.]

Tôi tạo ra VisualC++/CLR/Lớp thư viện và thêm lớp C++ của tôi (A được liệt kê dưới đây) và xây dựng. [Tôi đã sử dụng cài đặt mặc định nhưng trong cài đặt trình liên kết dự án tôi đã thử cả hai Đăng ký đầu ra có và không.] Không có lỗi và tệp .DLL được tạo.

Tôi đã tạo thư viện VisualC++/CLR/Class và tạo lớp trình bao bọc 'Class1' Tôi đã sử dụng tất cả các cài đặt mặc định. Theo tính chất dự án tôi nhấp vào 'Add New Reference' Tài liệu tham khảo" và chọn DLL tạo ra trong bước đầu tiên

tôi nhận được mối liên kết lỗi:.

test_NET_library.obj : error LNK2028: unresolved token (0A000009) "public: int __thiscall Z::A::m1(int,int)" ([email protected]@[email protected]@[email protected]) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" ([email protected]@[email protected]@[email protected]) 
test_NET_library.obj : error LNK2028: unresolved token (0A00000A) "public: int __thiscall Z::A::m2(int,int)" ([email protected]@[email protected]@[email protected]) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" ([email protected]@[email protected]@[email protected]) 
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m1(int,int)" ([email protected]@[email protected]@[email protected]) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" ([email protected]@[email protected]@[email protected]) 
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m2(int,int)" ([email protected]@[email protected]@[email protected]) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" ([email protected]@[email protected]@[email protected]) 
C:\temp\test_Cpp_CLI\test_NET_library\Debug\test_NET_library.dll : fatal error LNK1120: 4 unresolved externals 

Các lỗi tương tự như nếu tôi loại bỏ A. cpp trong dự án thư viện lớp bọc (tùy chọn hoạt động) Tôi không hiểu tại sao bản dựng đang cố gắng giải quyết các ngoại lệ ở địa điểm đầu tiên vì đây là thư viện chứ không phải là một chương trình. khác tôi cần phải thêm vào wrapp Tài sản dự án thư viện lớp er hoặc đăng ký DLL của các lớp không được quản lý, hoặc các tùy chọn trình biên dịch? Tôi cũng cần một tệp .lib để đi với DLL? (Không có file lib xuất hiện trong thư mục mục tiêu dự án)

Tôi vẫn phải sử dụng __declspec (dllexport) [nó nghĩ rằng chỉ là cho các chức năng phong cách C phải là thành viên lớp.] như trong câu hỏi: Export Unmanaged Classes from a Visual C++ DLL? thậm chí mặc dù thư viện C++ không được quản lý được biên dịch với CLR được kích hoạt.

(Tôi cũng thử biên dịch dưới dạng thư viện tĩnh, nhưng tôi không thể tìm ra cách thêm tệp .lib vào dự án thư viện lớp CLR).

lớp thử nghiệm của tôi là

namespace Z 
{ 
class A 
{ 
public: 

    int m1(int p1, int p2); 
    int m2(int p3, int p4); 
}; 
}; 

với việc thực hiện:

#include "A.h" 
namespace Z 
{ 
int A::m1(int p1, int p2) { return p1+p2; }; 
int A::m2(int p3, int p4) { return p3 * p4; }; 
}; 

Và lớp wrapper được

#pragma once 
#include "../A.h" 
using namespace System; 
namespace test_NET_library { 
public ref class Class1 
{ 
private: Z::A *a; 
public: Class1() 
    : a(new Z::A) 
    {} 
public: inline int m1(int p1, int p2) 
    { return a->m1(p1,p2); 
    }; 
public: inline int m2(int p3, int p4) 
    {return a->m2(p3,p4); 
    }; 
}; 
} 

Theo câu hỏi: C++/CLI Mixed Mode DLL Creation Tôi cũng đã cố gắng:

#pragma managed(push, off) 
#include "../A.h" 
#pragma managed(pop) 

Và điều này cũng đẩy được quản lý xung quanh A.cpp.

Cập nhật: Theo phản hồi của mcdave tôi đã xóa/clr này tạo ra một DLL, bây giờ làm cách nào để làm cho tệp DLL này có sẵn cho test_NET_library của tôi?

Tôi đã thử Tham khảo/Thêm tham chiếu mới và chọn tệp DLL mới này; và nhận được thông báo "Không thể thêm tham chiếu đến tập tin 'C: .. \ unmanaged_lib.dll' bởi vì nó không phải là NET lắp ráp hoặc đăng ký điều khiển ActiveX.". DLL đã được thêm vào danh sách tệp của dự án, nhưng trình biên dịch dường như bỏ qua nó.

Tôi đã thử Thêm/Hiện có mục và chọn DLL mới. nhưng tệp .DLL không phải là loại tệp có thể chọn.

+0

Hãy thử xóa/clr khỏi lớp DLL của A (nghĩa là biến nó thành 'bình thường' win32 dll) và nếu điều này không hoạt động, hãy cập nhật câu hỏi của bạn. – mcdave

+0

@mcdave: Tôi đã làm điều này, nhưng sau đó tôi không biết làm thế nào để làm cho test_NET_libary 'nhận thức' hoặc 'liên kết đến' unmanaged_lib.DLL chứa A (xem chỉnh sửa của tôi ở trên). Đó là cùng một vấn đề tôi đã cố gắng sử dụng unmanaged_lib như là một liên kết tĩnh .lib. –

Trả lời

6

Với vài gợi ý từ bản cập nhật của bạn tôi sẽ cố gắng hai đoán ...

  1. Khi unmanaged_lib là một lib tĩnh liên kết, bạn đã thiết lập các dự án unmanaged_lib là một sự phụ thuộc của test_NET_library? (Trong cửa sổ Project Explorer, nhấp chuột phải vào test_NET_library, chọn "Dependencies Project ..." và chọn unmanaged_lib.)
  2. Khi unmanaged_lib là một DLL, bạn cần xuất lớp từ DLL bằng cách theo dõi this câu trả lời và làm cho test_NET_library phụ thuộc vào dự án unmanaged_lib.
+0

Giải pháp 1 làm việc (thông thường tôi sử dụng Embarcadero C++ Builder, ở đó bạn chỉ cần thêm tệp .lib biên dịch vào dự án của bạn, thậm chí không cần thiết phải có tất cả các dự án thư viện tĩnh trong nhóm dự án của bạn (giải pháp), cũng không cần thiết thiết lập phụ thuộc). –

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