2012-06-08 8 views
7

¿Hay alguna forma de especificar el ensamblaje junto con el espacio de nombres en C#?Especifique el ensamblaje para el espacio de nombres

Por ejemplo, si hace referencia tanto a PresentationFramework.Aero como a PresentationFramework.Luna en un proyecto, es posible que observe que ambos comparten los mismos controles en el mismo espacio de nombres pero con una implementación diferente.

Tome ButtonChrome por ejemplo. Existe en ambos conjuntos bajo el espacio de nombre Microsoft.Windows.Themes.

En XAML que incluyen el montaje junto con el espacio de nombres por lo que aquí no hay problema

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

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

Pero en C# código detrás no puedo encontrar modos para crear una instancia de ButtonChrome en PresentationFramework.Aero.

El siguiente código me da CS0433 de error al compilar

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

CS0433 de error: El tipo existe 'Microsoft.Windows.Themes.ButtonChrome' en ambos
'C: \ Program Archivos (x86) \ Conjuntos de referencia \ Microsoft \ Framework.NETFramework \ v4.0 \ Profile \ Client \ PresentationFramework.Aero.dll '
y
' c: \ Archivos de programa (x86) \ Referencia Asambleas \ Microsoft \ Framework.NETFramework \ v4.0 \ Perfil \ Client \ PresentationFramework.Luna.dll'

que es muy comprensible, el compilador no tiene forma de saber qué ButtonChrome elegir porque no le he dicho eso. ¿Puedo hacer eso de alguna manera?

Respuesta

7

es necesario especificar un alias para la referencia de ensamblado y luego importar a través del alias:

extern alias thealias; 

ver la ventana de propiedades de las referencias.

Supongamos que alias el conjunto aerodinámico como "aero" y el conjunto luna como "luna". A continuación, puede trabajar con ambos tipos dentro del mismo archivo de la siguiente manera:

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(); 

Ver extern alias para obtener más información.

+0

Gracias Kent! Para PresentationFramework.Aero he establecido Aliases en aero y Incrustar Interop Types en False, pero sigo obteniendo 'error CS0430: El alias externo 'aero' no se ha especificado en una opción/reference'. ¿Algo más que deba hacer? –

+0

Desafortunadamente, parece que hay un error si el proyecto contiene ResourceDictionaries: http://connect.microsoft.com/VisualStudio/feedback/details/615953/reference-aliases-are-ignored-on-projects-containing-some-xaml -archivos. Lo probé sin ningún archivo XAML y funcionó. Este problema se solucionará en 4.5. Gracias de nuevo –

+0

@Meleak: interesante - No estaba al tanto de ese error. ¿Viste la solución? esa es una opción para ti? –

5

Alias ​​externas al rescate, consulte la documentación here. Después de haber añadido las referencias de ensamblado y creó los alias Luna y neumática en las respectivas propiedades de referencia, aquí es un código de ejemplo que puede probar:

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, gracias! Todavía me falta algo aquí, después de establecer los alias, sigo recibiendo el 'error CS0430: El alias externo 'aero' no se ha especificado en una opción/referencia'. ¿Alguna idea de lo que me podría estar perdiendo? –

+0

@Meleak: Seleccione la referencia de ensamblaje en la ventana del Explorador de soluciones, diríjase a la ventana Propiedades y cambie el valor de la propiedad Alias ​​de "global" a "Luna", "Aero", etc. – Alan

+0

Gracias de nuevo. Lo hice pero lamentablemente parece haber un error. Si el proyecto contiene ResourceDictionaries, se ignoran los alias: http://connect.microsoft.com/VisualStudio/feedback/details/615953/reference-aliases-are-ignored-on-projects-containing-some-xaml-files –

0

he conocido a un error similar con respecto System.NonSerializedAttribute al hacer referencia a Microsoft. Conjunto de secuencias de comandos, que también define este atributo (conflicto encontrado en el archivo Reference.cs generado por referencia de servicio).La forma más fácil de resolver esto es muy similar a definir alias, pero sin el dolor de cabeza de compilación:

En Visual Studio, vaya a las referencias de su proyecto, seleccione uno de los ensamblados que generan el conflicto, vaya a propiedades y complete Alias valor con algo no igual a global.

Cuestiones relacionadas