Possiedo un progetto di libreria di classi portatile destinato a .NET 4.6 e Universal Windows Platform. Questa libreria di classi contiene solo una classe con la seguente riga di codice nel suo costruttore:Come faccio a fare riferimento a una libreria portatile UWP + NET46 da un'applicazione di console .NET 4.6?
Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()));
Ora creare un nuovo progetto di applicazione .NET 4.6 di console nella stessa soluzione e aggiungere un riferimento al progetto per la libreria di classi portatile. La chiamata al metodo che ospita la linea di cui sopra dei risultati di codice nel seguente eccezione in fase di esecuzione:
Could not load file or assembly 'System.IO.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
Che cosa sto facendo male qui? Non ci sono errori o avvisi in fase di compilazione.
Le cose che ho provato: quelli mancanti pacchetto NuGet manualmente
Sembra che System.IO.FileSystem è una libreria fornita tramite NuGet, come parte del Microsoft.NETCore mega-pacchetto (?). Ok, forse ho bisogno di aggiungere esplicitamente questo pacchetto a qualsiasi progetto che usi la mia libreria di classi portatile. Cerco di farlo.
Could not install package 'Microsoft.NETCore.Platforms 1.0.0'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.6', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.
Nessuna fortuna con questo approccio.
Le cose che ho provato: Creare un file project.json
Mentre non v'è alcuna chiara informazioni sul web, ho letto un paio di bocconcini di una nuova project.json basato NuGet cablaggio o sistema di compilazione. Solo per sperimentare, ho creato il seguente file project.json nel mio progetto applicativo della console:
{
"dependencies": {
},
"frameworks": {
"net46": { }
},
"runtimes": {
"win-anycpu": { }
}
}
Funziona! L'errore di runtime va via! Tuttavia, ho scoperto presto che questa non era la soluzione giusta o non una soluzione completa. Ho iniziato a scrivere il codice per leggere i valori della sezione di configurazione, che ha coinvolto facendo uso dell'interfaccia IConfigurationSectionHandler
, ed ho ottenuto il seguente errore di compilazione:
error CS0246: The type or namespace name 'IConfigurationSectionHandler' could not be found (are you missing a using directive or an assembly reference?)
Questa interfaccia è parte del gruppo Sistema. Vedo un riferimento alla presente assemblea, ma ha l'icona di un punto esclamativo giallo, e appare un messaggio di avviso nella finestra avvertimenti:
The referenced component 'System' could not be found.
Questo è dove ho finito di idee. Mi sto perdendo qualcosa di totalmente ovvio?
Bene, non difficile da riprodurre. Targeting dnx è abbastanza coraggioso in questo momento, è la qualità beta. Si può zoppicare copiando System.IO.FileSystem.dll e System.IO.FileSystem.Primitives.dll dalla directory di runtime dnx, ma questo è ben meno ideale. Solo [file un bug] (https://github.com/aspnet/dnx/issues) in modo che possano risolverlo. –
@HansPassant DNX non è necessario per la riproduzione, quindi non viene visualizzato DNX. Tutto è uguale anche se eseguo il targeting DNX. Ho modificato la mia domanda per rimuovere questo potenziale punto di confusione. – Sander