2011-11-25 11 views
6

Estoy usando una serie de controles personalizados C# (formularios, botones, etc.) que utilizan un sistema de skinning y dependen de imágenes externas (en un archivo zip) dentro de la carpeta del proyecto. En este momento, el diseñador de formularios no puede mostrar los controles, porque no puedo obtener la ruta correcta al archivo zip. Lo que necesito es una forma de obtener el camino hacia el ensamblaje o la solución en el momento del diseño.C# Design Time Path

Estoy utilizando dos proyectos:
DLL - Contiene los controles personalizados.
Aplicación de host: hace referencia a la DLL y utiliza los controles personalizados.

En mis clases de control personalizados DLL, en tiempo de ejecución, simplemente estoy usando:

string skinPath = "./Skins/" + skin + ".zip"; 

que funciona perfectamente, pero en tiempo de diseño, el diseñador de formularios muestra el error:

Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Skins\Black.zip'. 

Después de haber visto preguntas similares en el sitio, he intentado lo siguiente también:
1)

if (designMode) 
{ 
    EnvDTE.DTE dte = GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    string path = Path.GetDirectoryName(dte.Solution.FullName); 
} 

El diseñador formulario muestra el error:

Object reference not set to an instance of an object. 

2)

if (designMode) 
{ 
    ITypeResolutionService typeResService = GetService(typeof(ITypeResolutionService)) as ITypeResolutionService; 
    string path = typeResService.GetPathOfAssembly(Assembly.GetExecutingAssembly().GetName()); 
} 

El diseñador formulario muestra el error:

Object reference not set to an instance of an object. 

3) Una variedad de diferentes caminos usando la clase de asamblea.

Nada hasta el momento ha funcionado. Estoy usando Visual C# 2010 Express.

+0

Ugh. No use 'como 'así. Usa un yeso en su lugar. –

+0

Lo siento, pero no era mi código. He estado copiando y pegando código de muchas preguntas diferentes, probando diferentes soluciones. – Snip3r

+0

Luego copie 'Black.zip' a' C:/Archivos de programa (x86)/Microsoft Visual Studio 10.0/Common7/IDE/Skins/':) –

Respuesta

1

Su segundo intento (ITypeResolutionService) debería funcionar bien. Solo asegúrese de llamar al GetService lo suficientemente tarde, para que la propiedad Site no sea nula. OnHandleCreated está bien, el constructor de control es demasiado pronto y produce NullReferenceException.

+0

Esto lo resolvió. Muchas gracias. Si bien el código en la opción 2 no funcionó, tenías razón al decir que era demasiado temprano. Agregué el código de la opción 1 en el controlador de eventos OnLoad, y el bingo: D Muy apreciado. – Snip3r

+0

Otra actualización, con un poco de ajuste en la ruta, la opción 2 también funcionó :) – Snip3r