2012-06-08 31 views
7

Có cách nào để chỉ định lắp ráp cùng với không gian tên trong C#? Ví dụ: nếu bạn tham chiếu cả hai PresentationFramework.AeroPresentationFramework.Luna trong một dự án, bạn có thể nhận thấy rằng cả hai đều chia sẻ cùng một điều khiển trong cùng một không gian tên nhưng với triển khai khác nhau.Chỉ định lắp ráp cho không gian tên

Lấy ví dụ ButtonChrome. Nó tồn tại trong cả hai hội đồng dưới không gian tên Microsoft.Windows.Themes.

Trong XAML bạn bao gồm lắp ráp cùng với không gian tên như vậy ở đây nó không có vấn đề

xmlns:aeroTheme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
xmlns:lunaTheme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna" 

<aeroTheme:ButtonChrome ../> 
<lunaTheme:ButtonChrome ../> 

Nhưng trong C# mã đằng sau tôi không thể tìm thấy anyway để tạo một thể hiện của ButtonChrome trong PresentationFramework.Aero.

Các mã sau đây mang lại cho tôi lỗi CS0433 khi biên dịch

using Microsoft.Windows.Themes; 
// ... 
ButtonChrome buttonChrome = new ButtonChrome(); 

lỗi CS0433: Loại 'Microsoft.Windows.Themes.ButtonChrome' tồn tại trong cả
'c: \ Program Files (x86) \ Tham chiếu Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Hồ sơ \ Client \ PresentationFramework.Aero.dll '

' c: \ Program Files (x86) \ Tham khảo Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Hồ sơ \ Khách hàng \ PresentationFramework.Luna.dll'

Đó là rất dễ hiểu, trình biên dịch không có cách nào để biết mà ButtonChrome để lựa chọn bởi vì tôi đã không nói nó. Tôi có thể làm điều đó bằng cách nào đó không?

Trả lời

7

Bạn cần phải xác định một bí danh cho tài liệu tham khảo lắp ráp và sau đó nhập thông qua các bí danh:

extern alias thealias; 

Xem cửa sổ thuộc tính cho các tài liệu tham khảo.

Giả sử bạn đặt bí danh cụm aero là "aero" và cụm luna là "luna". Sau đó, bạn có thể làm việc với cả hai loại trong cùng một tệp như sau:

extern alias aero; 
extern alias luna; 

using lunatheme=luna::Microsoft.Windows.Themes; 
using aerotheme=aero::Microsoft.Windows.Themes; 

... 

var lunaButtonChrome = new lunatheme.ButtonChrome(); 
var aeroButtonChrome = new aerotheme.ButtonChrome(); 

Xem extern alias để biết thêm thông tin.

+0

Cảm ơn Kent! Đối với PresentationFramework.Aero tôi đã đặt bí danh để aero và nhúng Interop loại sai nhưng tôi vẫn nhận được 'lỗi CS0430: bí danh extern 'aero' đã không được chỉ định trong một/tham khảo tùy chọn'. Tôi cần làm gì nữa? –

+0

Thật không may, có vẻ như là một lỗi nếu dự án chứa ResourceDictionaries: http://connect.microsoft.com/VisualStudio/feedback/details/615953/reference-aliases-are-ignored-on-projects-containing-some-xaml -các tập tin. Tôi đã thử nó mà không có bất kỳ tập tin XAML và nó làm việc. Vấn đề này sẽ được sửa trong 4.5. Cảm ơn một lần nữa –

+0

@Meleak: thú vị - Tôi đã không nhận thức được lỗi đó. Bạn có thấy cách giải quyết không? Đó có phải là một lựa chọn cho bạn? –

5

Bí danh bên ngoài để giải cứu, xem tài liệu here. Sau khi thêm tài liệu tham khảo lắp ráp và tạo ra các bí danh Luna và Aero trong các thuộc tính tài liệu tham khảo tương ứng, đây là một số mẫu mã bạn có thể thử:

extern alias Aero; 
extern alias Luna; 

using System.Windows; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow: Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var chrome1 = new Luna::Microsoft.Windows.Themes.ButtonChrome(); 
     var chrome2 = new Aero::Microsoft.Windows.Themes.ButtonChrome(); 
     MessageBox.Show(chrome1.GetType().AssemblyQualifiedName); 
     MessageBox.Show(chrome2.GetType().AssemblyQualifiedName); 
    } 
    } 
} 
+0

+1, cảm ơn! Tôi vẫn còn thiếu một cái gì đó ở đây, sau khi thiết lập bí danh tôi vẫn nhận được 'lỗi CS0430: Các bí danh extern 'aero' đã không được chỉ định trong một/tham khảo tùy chọn'. Bất kỳ ý tưởng những gì tôi có thể bị mất tích? –

+0

@Meleak: Chọn tham chiếu assembly trong cửa sổ Solution Explorer, đi đến cửa sổ Properties và thay đổi giá trị của thuộc tính Aliases từ "global" thành "Luna", "Aero", v.v. – Alan

+0

Cảm ơn bạn lần nữa. Tôi đã làm điều đó nhưng tiếc là có vẻ như là một lỗi. Nếu dự án chứa ResourceDictionaries, bí danh bị bỏ qua: http://connect.microsoft.com/VisualStudio/feedback/details/615953/reference-aliases-are-ignored-on-projects-containing-some-xaml-files –

0

Tôi đã gặp một lỗi tương tự liên quan đến System.NonSerializedAttribute khi tham khảo Microsoft. Scripting assembly, cũng định nghĩa thuộc tính này (xung đột được tìm thấy trong tệp Reference.cs được tạo bởi tham chiếu dịch vụ).Cách dễ nhất để giải quyết vấn đề này rất giống với việc xác định bí danh, nhưng không có sự đau đầu biên dịch:

Trong Visual Studio, hãy chọn một trong các hội đồng tạo xung đột, đi đến các thuộc tính và điền Bí danh giá trị với một cái gì đó không bằng toàn cầu.

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