2012-01-19 38 views
7

Trong Visual Studio 10 - Visual Basic, tại sao tôi không thể nhập "System.Drawing" khi tham chiếu duy nhất của tôi là "System"? Tôi có thể nhập "System.Runtime.InteropServices".Visual Basic, tại sao tôi không thể nhập "System.Drawing" khi tham chiếu duy nhất của tôi là "System"?

Để tái tạo sự cố của tôi:
1. Tạo dự án mới trong Visual Studio 10 bằng mẫu Thư viện lớp cơ bản Visual Basic.
2. Thêm "Import System.Drawing" và "Imports System.Runtime.InteropServices" ở đầu.
3. Xóa tất cả các tham chiếu ngoại trừ "Hệ thống" trong ngăn Tham chiếu của thuộc tính dự án.

Kết quả: Visual Studio không thể tìm thấy "System.Drawing" nhưng có thể tìm thấy "System.Runtime.InteropServices". "System.Drawing" đủ điều kiện để hệ thống có thể tìm thấy nó bên trong "Hệ thống" được tham chiếu.

Suy nghĩ: Có vẻ "Hệ thống" và "System.Drawing" là các không gian tên riêng biệt (hoặc vùng chứa?) Vậy tại sao không đủ tiêu chuẩn "." công việc? Làm "." đại diện cho cái gì khác?

"Hệ thống" cũng nằm trong "mscorlib" nhưng đó là không gian tên được sử dụng hoặc là không gian tên khác?

"Microsoft.VisualBasic" cũng được liệt kê trong không gian tên đã nhập nhưng không có tham chiếu đến nó. Làm thế nào nó được tìm thấy? Danh sách "Không gian tên đã nhập" được điền từ đâu?

Một liên kết đến bất kỳ thông tin liên quan nào từ thư viện MSDN chắc chắn sẽ hữu ích. Tôi đã xem xét nó trong một thời gian nhưng không thể hiểu tại sao "System.Drawing" không được nhập.

Trả lời

14

Cơ sở hạ tầng .NET Common Language có hai khái niệm khác nhau:

  • Namespaces: Tiền tố cho tên kiểu như System.Drawing, được sử dụng để phân biệt nhiều loại mà nếu không sẽ có cùng tên.
  • Assemblies: Thư viện mã có thể được triển khai, cài đặt và được phiên bản riêng biệt với các hội đồng khác. Các loại trong một hội đồng có thể ở bất kỳ số lượng không gian tên nào.

Namespaces tạo thành một hệ thống phân cấp dựa trên đầy đủ-stop (dot) tách - vì vậy bạn có nghĩa là để nghĩ rằng các loại trong không gian tên System.Runtime.InteropServices là phụ thuộc vào những người thân trong không gian tên System.Runtime. Tuy nhiên, theo như tôi biết, CLI không quan tâm đến tên hoặc phân cấp của các không gian tên của bạn, ngoại trừ trong trường hợp chúng làm cho tên của bạn trở nên độc đáo. Hơn nữa, một assembly có thể chứa các kiểu từ nhiều không gian tên, thậm chí cả những cái trong các hệ thống phân cấp khác nhau, và một vùng tên duy nhất có thể chứa các kiểu được định nghĩa trong nhiều assembly. Nếu bạn xem tài liệu MSDN cho một kiểu trong thư viện .NET, nó sẽ cho bạn biết loại assembly nào đang ở. Tuy nhiên, as Paolo Falabella has pointed out, MSDN sẽ không cho bạn biết không gian tên nào được lắp ráp, bởi vì một vùng tên duy nhất có thể chứa các kiểu từ nhiều hội đồng.

Trong trường hợp của bạn: mscorlib là một hội đồng định nghĩa một số loại trong không gian tên System và nhiều loại khác, chẳng hạn như System.Runtime.InteropServices, như bạn đã lưu ý. Tuy nhiên, các loại bạn đang sử dụng trong không gian tên System.Drawing được đặt trong hội đồng System.Drawing.

Vì hội đồng là đơn vị triển khai mã và sử dụng lại, Visual Studio dự án tham chiếu hội đồng, không phải không gian tên, và vì vậy bạn phải thêm tham chiếu đến System.Drawing assembly trong dự án Visual Studio cho chương trình của bạn.

The VB.NET Imports statement (và tương đương C#, using directive) cho phép bạn tham chiếu các loại trong không gian tên mà không phải nhập tên không gian tên mỗi lần. Tức là, với Imports System.Drawing, bạn có thể viết Graphics trong mã của mình thay vì System.Drawing.Graphics. Nhưng đó là tất cả câu lệnh Nhập khẩu thực hiện. Cụ thể:

  • Imports System không tự động tạo tham chiếu dự án cho mọi hội đồng trên thế giới xảy ra để xác định loại trong không gian tên Hệ thống.
  • Imports mscorlib không có nghĩa là bạn tham chiếu mọi loại trong cụm "mscorlib" theo tên ngắn của nó. Điều đó có nghĩa là bạn có thể tham chiếu các loại trong không gian tên "mscorlib" bằng tên ngắn của chúng, không chỉ hoàn toàn khác nhau mà rất khó có thể là thứ bạn muốn.

Dòng dưới cùng: nếu bạn muốn truy cập GDI +, thì bạn sử dụng các loại trong không gian tên System.Drawing, nhưng tên đó không liên quan đến tên của hội đồng GDI +. Microsoft đã chọn tên "System.Drawing" cho assembly có chứa các kiểu GDI +, nhưng nó có thể đã chọn "gdiplus-cli", "gdi-for-dotnet", hoặc thậm chí là "Frobinator". Dù cái tên mà assembly đó có, bạn phải thêm một tham chiếu đến assembly đó. Và bạn không làm điều đó trong mã nguồn của bạn - you add assembly references in your Visual Studio project configuration.

MSDN has an outdated but still good description of assemblies, namespaces, and the differences between them, which you may find helpful.

+0

Vì vậy, nếu tôi hiểu chính xác, 'Hệ thống nhập' sẽ kéo vào tất cả các assembly xác định toàn bộ không gian tên' System'. Mặt khác, 'import mscorlib' sẽ chỉ kéo vào phần mà assembly của nó được định nghĩa. – mdinger

+0

KHÔNG! Câu lệnh Imports chỉ hoạt động với các không gian tên. Nó biết * không có gì * về hội đồng. Tôi sẽ chỉnh sửa câu trả lời của tôi để giải thích điều này. –

+0

Đó là một sự phân biệt nhập khẩu mà làm cho rất nhiều ý nghĩa.Trước khi bạn giải thích điều này, tôi đã có thể nói rằng tài liệu tham khảo làm cho nguồn lực có sẵn để được nhập khẩu bằng cách cho các vị trí tập tin tài nguyên; tuy nhiên, tài nguyên chỉ có thể được truy cập thông qua câu lệnh 'Imports'. Cảm ơn bạn đã nỗ lực. Trước đây tôi thấy họ rất khó hiểu và không rõ ràng. Bây giờ việc tham khảo và nhập khẩu có ý nghĩa hơn nhiều. – mdinger

1

System.Drawing nằm trong một hội đồng riêng biệt mà bạn cần tham khảo.

6

Không gian tên System.Drawing "sống" trong một dll khác không được tham chiếu ban đầu trong dự án mẫu cho thư viện lớp. Bạn sẽ phải thêm tham chiếu đến System.Drawing (nhấp chuột phải vào dự án -> thêm tham chiếu; System.Drawing nằm trong GAC).

Trên MSDN, bạn có thể xem những gì lắp ráp mỗi lớp "sống". Ví dụ, trong các tài liệu hướng dẫn cho Bitmap class bạn có thể thấy:

Namespace: System.Drawing

hội: System.Drawing (trong System.Drawing.dll)

Lưu ý rằng at the namespace level bạn không thể tìm thấy thông tin "Assembly", bởi vì bạn có thể thêm các lớp vào cùng một không gian tên từ các assembly khác nhau.

0

Ngay cả sau khi thêm System.Drawing như một tài liệu tham khảo, nó vẫn có thể không được bao gồm trong một dự án.

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