Tengo una aplicación ASP.NET Core que se ejecuta en .NET 4.5.2.

La aplicación usa un archivo hello.json. Originalmente lo copié en la carpeta de compilación, así:

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "copyToOutput": [ "hello.json" ]
  },

Luego, el archivo se copió a ...\bin\Debug\net452\win7-x64\ durante la compilación.

No tengo ningún problema para ejecutar MyApp.exe, pero si voy a ...\bin\Debug\net452\ y ejecuto win7-x64\MyApp.exe, aparece el siguiente error al intentar leer el archivo: System.IO.FileNotFoundException Could not find file '...\bin\Debug\net452\hello.json'.

Intenté incrustar hello.json en el ensamblaje, así:

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "embed": [ "hello.json" ]
  }

Pero obtuve el mismo resultado.

¿Cómo hacer que la aplicación entienda que se supone que debe buscar el archivo donde está .exe, no donde se está ejecutando?

0
KevinG 14 dic. 2016 a las 00:21

2 respuestas

La mejor respuesta

Resulta que obtenía el mismo resultado con el recurso incrustado porque hello.json todavía estaba en la carpeta win7-x64\ (había sido copiado allí por mi compilación anterior).

Necesita obtener este archivo del ensamblaje, así que cambié esto:

using (var reader = new StreamReader("hello.json", Encoding.UTF8))
{
    return reader.ReadToEnd();
}

A esto:

Assembly executingAssembly = Assembly.GetExecutingAssembly();
Stream jsonStream = executingAssembly.GetManifestResourceStream("MyApp.hello.json");
using (var reader = new StreamReader(jsonStream, Encoding.UTF8))
{
    return reader.ReadToEnd();
}

Referencia: http://codeopinion.com/asp-net-core-embedded-resource/ < / a> (Nota: usa resource en JSON, que ahora está en desuso y debe reemplazarse con embed; vea mi project.json en la pregunta)

1
KevinG 14 dic. 2016 a las 17:56

Debe darle a su archivo json una acción de compilación de "Contenido" y no copiarlo a la carpeta de salida manualmente

0
Jonathan 13 dic. 2016 a las 21:32