2016-12-13 3 views
0

Ich habe eine ASP.NET Core App, die auf .NET 4.5.2 ausgeführt wird..NET Core App sucht nach eingebetteter Datei im falschen Ordner

Die App verwendet eine Datei hello.json. Ich ursprünglich auf den Build-Ordner kopiert, wie folgt aus:

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

Die Datei dann auf ...\bin\Debug\net452\win7-x64\ während der Kompilierung kopiert wurde.

Ich habe kein Problem MyApp.exe laufen, aber wenn ich zu ...\bin\Debug\net452\ gehen und laufen win7-x64\MyApp.exe, bekomme ich folgende Fehlermeldung, wenn die Datei zu lesen versuchen: System.IO.FileNotFoundException Could not find file '...\bin\Debug\net452\hello.json'.

Ich versuchte hello.json in der Versammlung einzubetten, wie folgt:

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

aber ich habe das gleiche Ergebnis.

Wie die App verstehen, dass es nach der Datei suchen soll, wo die .exe ist, nicht wo es ausgeführt wird?

+0

Können Sie uns den Code zeigen, der die Datei von der Festplatte liest? –

+0

Es ist nur 'using (var reader = neuer StreamReader (jsonFilePath, Encoding.UTF8)) {return reader.ReadToEnd(); } 'mit jsonFilePath der Pfad relativ zu der .exe. Ich erkannte, dass das Einbetten der Datei das ändern muss (mein Beispiel funktionierte noch, aber weil ich hallo.json nicht aus dem Ordner entfernt hatte), arbeite ich an diesem ATM. Als alternative Lösung kann ich den ausführbaren Pfad mit 'Path.GetDirectoryName (Assembly.GetExecutingAssembly() .Location) 'finden, aber es sieht schmutzig aus. – KevinG

Antwort

1

Wie sich herausstellte, war ich mit der eingebetteten Ressource in den Ausgabeordner kopieren das gleiche Ergebnis bekommen, weil hello.json war immer noch im Ordner win7-x64\ (es wurde dort von meiner vorherigen Kompilierung kopiert).

Sie müssen diese Datei aus der Versammlung zu bekommen, also habe ich dies:

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

dazu:

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

Referenz: http://codeopinion.com/asp-net-core-embedded-resource/ (Anmerkung: Es nutzt resource in JSON, das ist jetzt veraltet und sollte ersetzt werden mit embed - siehe meine project.json in der Frage)

+0

Ich bin ein bisschen neugierig, wie Sie es geschafft haben, dass dies funktioniert. 'GetExecutingAssembly()' ist in .net core nicht verfügbar, soweit ich das sehen kann. – melwil

+0

@melwil Es ist in 'System.Reflection.Assembly. Um genau zu sein benutze ich ASP.NET Core auf .NET 4.5.2, also nicht die .NET Core Architektur. – KevinG

+0

Ok, ich habe die Frage jetzt erneut gelesen und gesehen, dass sie auf 4.5.2 lief. Macht also Sinn. – melwil

0

Sie Ihre JSON-Datei eine Build-Aktion von „Inhalt“ geben sollte und es nicht manuell

Verwandte Themen