c# - tipo - no puedo abrir archivos pdf en mi pc
No se puede cargar un recurso de manifiesto con GetManifestResourceStream() (8)
Creé una sección de configuración personalizada usando XSD. Para analizar el archivo de configuración que sigue a este nuevo esquema, cargo el recurso (mi archivo .xsd) con esto:
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 está aquí:
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
El xsdStream es nulo, ¡así que supongo que no se puede encontrar el recurso! ¿Pero por qué?
Gracias
Puede obtener el flujo de recursos pasando los nombres de los recursos, que es el siguiente a continuación ...
Obtener el nombre del recurso, por ej.
Assembly objAssembly = Assembly.GetExecutingAssembly ();
string [] strResourceNames = objAssembly.GetManifestResourceNames ();
Pase los nombres de recursos a ...
Stream strm = objAssembly.GetManifestResourceStream (strResourceNames);
Ahora que tienes Stream puedes hacer lo que quieras ...
De forma predeterminada, Visual Studio no incrusta el archivo xsd, por lo tanto, debe asegurarse de que la propiedad "Build Action" del archivo xsd esté configurada como "Recurso incrustado" para que funcione.
El nombre del recurso siempre es:
<Base namespace>.<RelativePathInProject>.<FileName>
Entonces, si su recurso está ubicado en "Recursos / Xsd /", y su espacio de nombre de proyecto predeterminado es "MonitoringAPI.Configuration", el nombre del recurso es:
"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"
También asegúrese de que la acción de compilación para su recurso esté configurada como "Recurso incrustado"
En mi caso,
Cuando intenta 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 en el archivo que ha agregado a la solución y haga clic en Propiedades.
Seleccione la Build Action
como Embedded Resource
. (En lugar de Content
- por defecto)
En mi caso, era algo completamente diferente:
Mi aplicación UWP se compiló correctamente en la configuración de depuración y liberació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 habilitaba la configuración "Compilar con la cadena de herramientas Native .NET" . Después de deshabilitar, GetManifestResourceStream funcionó como se esperaba.
Manera fácil y correcta de obtener el nombre real de su recurso incrustado:
string[] resourceNames =
Assembly.GetExecutingAssembly().GetManifestResourceNames();
Luego, simplemente revise resourceNames array, y sabrá con certeza qué pasar al método GetManifestResourceStream.
Tuve un problema donde estaba incrustando un montón de archivos .xsd en muchos ensamblajes diferentes; todo estaba funcionando (GetManifestResourceNames devolvía los archivos que esperaría ver) excepto uno. El que no era se llamaba:
Something.LA.xsd
No estaba tratando con culturas específicas y el compilador recogía el bit .LA al final del nombre del archivo, ya que este era para la cultura LA: el nombre de archivo en el manifiesto entraba en Something.xsd (en la cultura) LA) - de ahí que no pueda encontrarlo (terminó en un conjunto de satélites). Evité el problema al renombrar el archivo; presumiblemente, es posible establecer explícitamente la cultura de un recurso incrustado.
En realidad, un google rápido revela: ¿Cómo puedo evitar que la cultura de archivos de recursos incrustados se establezca en función de su nombre de archivo?
De acuerdo con esta respuesta, tienes que hacer cosas chifladas, así que tal vez renombrar el archivo no era tan malo después de todo :)
solo agregue sus recursos en form1.resx -> agregue elementos existentes
Haga doble clic en los recursos que agregó en Recursos carpeta.go a propiedades y seleccione "Recursos incrustados" en lugar de ninguno.
Luego intenta depurar la línea:
string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
verifique 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!