2010-06-18 30 views
39

He creado una sección de configuración personalizada utilizando XSD. Con el fin de analizar el archivo de configuración que sigue a este nuevo esquema, me carga el recurso (mi archivo .xsd) con esto:No se puede cargar un recurso de manifiesto con GetManifestResourceStream()

public partial class MonitoringConfiguration 
    { 
     public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd"; 
     public const string ConfigSchema = "urn:MonitoringConfiguration-1.0"; 

     private static XmlSchemaSet xmlSchemaSet; 

     static MonitoringConfiguration() 
     { 
      xmlSchemaSet = new XmlSchemaSet(); 
      Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd); 
      XmlReader schemaReader = XmlReader.Create(xsdStream); 
      xmlSchemaSet.Add(ConfigSchema, schemaReader); 
     } 

    } 

Por cierto mi recurso es: MonitoringConfiguration.xsd. Y el espacio de nombres de la otra clase parcial (que representa el código detrás del archivo .xsd) es MonitoringAPI.Configuration.

El problema se encuentra aquí:

Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd); 

El xsdStream es nulo, así que supongo que el recurso no puede ser encontrado! ¿Pero por qué?

Gracias

Respuesta

75

El nombre del recurso es siempre:

<Base namespace>.<RelativePathInProject>.<FileName>

lo tanto, si el recurso se encuentra en "Recursos/Xsd /", y el espacio de nombres del proyecto por defecto es "MonitoringAPI. configuración", el nombre del recurso es:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

también asegúrese de que la construcción de una cción para el recurso se ajusta a "Recurso incrustado"

+0

Mi recurso está situado en el mismo directorio que esta clase. –

+1

Haga clic derecho en el archivo y elija "Propiedades". –

+0

¡Gracias ese fue el problema!Pasé medio día averiguando el problema y lo resolvió en un minuto;) –

8

De manera predeterminada, Visual Studio no incrusta el archivo xsd por lo tanto, debe asegurarse de "Acción de generación" propiedad del archivo xsd está ajustado en "Recurso incrustado" para hacer que funciona

48

Fácil y forma correcta para obtener el nombre real de su recurso incrustado:

string[] resourceNames = 
    Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

Después, simplemente comprobar gama ResourceNames, y sabrá a ciencia cierta lo que pase con el método GetManifestResourceStream.

+2

Al usuario1958681 ... ¡¡¡SÍ !!! En mi caso, las rutas de recursos eran "no estándar", en el sentido de que no tenían el subdirectorio de recursos en sus nombres. El truco de la matriz fue perfecto para saber el nombre correcto. ¡¡Muchas gracias!! –

+0

El mío tampoco tenía el subdir en sus nombres. ¿Alguien sabe por qué? –

+1

Encontré ejecutando 'Assembly.GetExecutingAssembly(). GetManifestResourceNames();' en la Ventana Intermedia mientras la depuración era suficiente. Da una buena salida formateada que es fácil de leer. – Lankymart

8

En mi caso,

Al intentar acceder al archivo a través de GetManifestResourceStream(). Obtendrá un error debido a la ruta no válida del archivo y la transmisión será nula.

Solución:

Haga clic derecho sobre el archivo que ha añadido a la solución y haga clic en Propiedades.

Seleccione Build Action como Embedded Resource. (En lugar de Content - por defecto)

Build action property set to embedded resource

4

acaba de añadir sus recursos bajo Form1.resx -> añadir elementos existentes

doble clic sobre los recursos que agregó en Recursos folder.go a las propiedades y seleccione "Recursos incrustados" en lugar de ninguno.

Entonces intentar depurar la línea:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames(); 

verificación de los recursos que ha agregado están en la matriz. luego copie el nombre del recurso exactamente de esta matriz e intente poner el nombre en su código ... ¡funciona bien!

1

que pueda obtener la secuencia de recursos haciendo pasar los nombres de recurso es el siguiente abajo ...

  1. Obtener el nombre de recurso, por ejemplo.

    Asamblea objAssembly = Assembly.GetExecutingAssembly();

    cadena [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. Pasar los nombres de recurso a ...

    corriente strm = objAssembly.GetManifestResourceStream (strResourceNames);

Ahora usted tienen corriente que puede hacer lo que quiera ...

0

En mi caso, era algo completamente diferente:

Mi uwp aplicación compilado correctamente en depuración y Versión de configuración, pero GetManifestResourceStream devolvió la configuración de liberación solo Null.

El problema era que en el archivo UWP Build Configuration (y solo allí) se habilitó la configuración "Compilar con la cadena de herramientas Native .NET". Después de deshabilitar, GetManifestResourceStream funcionó como se esperaba.

0

Tuve un problema en el que estaba integrando un montón de archivos .xsd en muchos ensamblajes diferentes; todo estaba funcionando (GetManifestResourceNames devolvía los archivos que esperaría ver) excepto uno. La única que no fue llamado:

Something.LA.xsd 

yo no estaba tratando con culturas específicas y el bit .LA al final del nombre de archivo estaba siendo recogido por el compilador que este archivo es para la cultura LA - el nombre del archivo en el manifiesto entraba en Something.xsd (bajo cultura LA) - por lo tanto, no pude encontrarlo (terminó en un ensamblaje satelital). Evité el problema al renombrar el archivo; presumiblemente, es posible establecer explícitamente la cultura de un recurso incrustado.

En realidad, una rápida de Google revela: How can I prevent embedded resource file culture being set based on its filename

De acuerdo con esta respuesta, usted tiene que hacer las cosas hacky - así que quizás cambiar el nombre del archivo no era tan malo después de todo :)

Cuestiones relacionadas