2010-06-10 37 views
29

Tôi đang trong quá trình di chuyển thư viện được viết bằng C++ và có trình bao bọc C#. C# wrapper (LibWrapper) có một tập hợp các lớp học với không gian tên, như:Lớp có cùng tên trong hai hội đồng (cố ý)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

thư viện mới của tôi, LibraryCS chứa các không gian tên tương tự và tên lớp như LibWrapper (theo yêu cầu của người sử dụng), vì vậy tôi cũng có:

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

Bây giờ quá trình di chuyển được thực hiện, tôi đang trong quá trình tạo thử nghiệm so sánh kết quả của việc sử dụng cả hai thư viện, để xác thực di chuyển. Tuy nhiên, khi tôi cố gắng tham khảo MyNamespace.MyClass tôi nhận được một lỗi trình biên dịch (dự kiến!) Mà nói "MyNamespace.MyClass được định nghĩa trong cả LibWrapper và LibraryCS".

Có bất kỳ mẹo nào xung quanh vấn đề này, điều đó sẽ cho phép tôi sử dụng hai lớp có cùng tên chính xác nhưng từ các hội đồng khác nhau trong cùng một mã máy khách không?

Ngoài ra, có cách nào khác để kiểm tra điều này không?

Đổi tên không gian tên được di chuyển thành một thứ như MyNamespace2 sẽ hoạt động, nhưng chúng tôi được yêu cầu không làm điều đó, để giữ cho mã máy khách dễ di chuyển hơn.

+0

Bạn có thể viết trình bao bọc xung quanh một trong các lớp tồn tại trong không gian tên khác không? – Goblin

+0

Nếu tôi có thể chạy cả hai trong cùng một mã kiểm tra, nó có thể được chấp nhận. Nó sẽ là một wrapper chỉ được sử dụng cho mục đích thử nghiệm. – pgb

Trả lời

54

Bạn có thể sử dụng một extern alias để tham khảo các loại với tên đầy đủ cùng từ hội khác nhau. Chọn tham chiếu đến LibraryCS và cập nhật Bí danh trong trang thuộc tính từ "global" thành "LibraryCS" và thêm extern alias LibraryCS; vào đầu tệp nguồn của bạn và sau đó bạn có thể sử dụng LibraryCS::MyNamespace.MyClass để tham chiếu đến lớp trong LibraryCS. Bạn có thể sử dụng MyNamespace.MyClass hoặc global::MyNamespace.MyClass để tham chiếu đến lớp học trong LibWrapper hoặc bạn cũng có thể sử dụng bí danh cho tham chiếu đó.

+4

Tôi đồng ý với Quartermeister. Xem bên dưới để tham khảo thêm: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

4

Để tải cả hai lớp này trong cùng một tệp thực thi, bạn có thể tải chúng trong một Miền ứng dụng riêng biệt. Điều này sẽ cho phép bạn kiểm tra các hội đồng, sau đó hoàn toàn dỡ nó và tải một thứ hai và kiểm tra nó.

Để biết chi tiết về cách thực hiện việc này, hãy xem How to: Load Assemblies into an Application DomainUnload an Application Domain.

0

Bạn có thể nạp cụm đầu tiên vào thời gian chạy sau đó sử dụng sự phản chiếu để khởi tạo nó và thực thi phương thức của nó. Sau đó, dỡ bỏ lắp ráp, tải lắp ráp thứ hai và sử dụng sự phản chiếu để tạo ra nó và chạy các phương thức của nó.

Nó có lẽ muốn được dễ dàng hơn để sử dụng 2 quy trình riêng biệt sau đó so sánh kết quả đầu ra ...

+1

Bạn không thể dỡ một assembly trực tiếp, chỉ có một AppDomain. Để làm điều này, bạn cần một appdomain riêng biệt với assembly đó. –

+0

Cuộc gọi tốt, sẽ phải gỡ bỏ AppDomain để dỡ bỏ lắp ráp, tôi sẽ chỉnh sửa phản hồi. –

1

Thấy câu hỏi và câu trả lời này và nó đã giúp tôi. Làm thế nào bao giờ cho những người cần một lời giải thích chi tiết trên cùng, tôi tìm thấy một link đó là thực sự hữu ích.

Trích xuất từ ​​liên kết.

Sử dụng các phiên bản khác nhau của cùng một dll trong một ứng dụng

bước 1: sử dụng VS IDE. Thêm tham chiếu cho cả hai dll trong giải pháp ứng dụng khách của bạn. Sau đó, trong Solution Explorer dưới nút tham chiếu, hãy chọn thư viện lớp đầu tiên (phiên bản cũ).Trong cửa sổ thuộc tính, hãy thay đổi trường Bí danh từ toàn cầu thành oldVer. lly, newVer cho phiên bản e ewer.

Bước 2: sử dụng mã dưới đây như những điều khoản đầu tiên mà bạn có kế hoạch để tham khảo nó

extern alias oldVer; 
extern alias newVer; 

nay đến sử dụng,

Console.WriteLine(oldVer::MyLibrary.MyClass.method()); 
Console.WriteLine(newVer::MyLibrary.MyClass.method()); 

Hope this helps.

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