2017-05-04 5 views
3

Speziell auf Ubuntu scheint dies nicht zu funktionieren.Wie verwende ich eine .NET-Kernklassenbibliothek in einer .NET-Kernanwendung?

Zum Beispiel, wenn ich dies tun:

dotnet new sln -n HelloWorld 
dotnet new classlib -n HelloLib 
dotnet new console -n HelloApp 
dotnet sln add ./HelloApp/HelloApp.csproj 
dotnet sln add ./HelloLib/HelloLib.csproj 
dotnet restore 
dotnet build 

cd HelloApp/ 
dotnet add reference ../HelloLib/HelloLib.csproj 

Und ändern Program.cs sein:

using System; 
using HelloLib; 

namespace HelloApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = new Class1(); 
      Console.WriteLine("Hello World!"); 
     } 
    } 
} 

Dann wird die Anwendung kompilieren, diese Artefakte zu erzeugen:

HelloApp/bin$ du -a 
4 ./Debug/netcoreapp1.1/HelloApp.deps.json 
4 ./Debug/netcoreapp1.1/HelloApp.runtimeconfig.json 
4 ./Debug/netcoreapp1.1/HelloApp.pdb 
4 ./Debug/netcoreapp1.1/HelloLib.pdb 
8 ./Debug/netcoreapp1.1/HelloApp.dll 
4 ./Debug/netcoreapp1.1/HelloApp.runtimeconfig.dev.json 
4 ./Debug/netcoreapp1.1/HelloLib.dll 
36 ./Debug/netcoreapp1.1 
40 ./Debug 
44 . 

... aber die Ausführung der Anwendung schlägt fehl:

$ dotnet HelloApp.dll 

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'HelloLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified. 

Aborted (core dumped) 

Wenn ich die using HelloLib Linie entfernen, funktioniert es:

$ dotnet HelloApp.dll 
Hello World! 

Was ist da los?

Ich nehme an seine bekam etwas mit der verwirrenden Unvereinbarkeit in den Projektdateien zu tun:

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup> 
    <TargetFramework>netstandard1.4</TargetFramework> <-- **THIS** 
    </PropertyGroup> 

</Project> 

vs:

<Project Sdk="Microsoft.NET.Sdk"> 
    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp1.1</TargetFramework> <-- **And THIS** 
    </PropertyGroup> 
    <ItemGroup> 
    <ProjectReference Include="..\HelloLib\HelloLib.csproj"> 
     <Project>{1607a379-5bae-423b-8efc-796a06556be0}</Project> 
     <Name>HelloLib</Name> 
    </ProjectReference> 
    </ItemGroup> 
</Project> 

Ich nahm dies nur ein Fehler war.

... aber andere Leute scheinen .NET-Kern ohne zu viel Mühe zu verwenden.

Also, mache ich etwas falsch?

Oder sind die Menschen ‚mit‘ .NET Kern nicht nur Klassenbibliotheken verwenden, weil sie nicht arbeiten?

(edit: Versionen:

Microsoft .NET Core Shared Framework Host 

    Version : 1.1.0 
    Build : 928f77c4bc3f49d892459992fb6e1d5542cb5e86 

$ dpkg -l |grep dotnet 
ii dotnet-dev-1.0.3             1.0.3-1          amd64  .NET Core SDK 1.0.3 

$ cat /etc/issue 
Ubuntu 16.10 \n \l 
+0

Ist Ihre DLL aus Ihrem Arbeitsprojektverzeichnis vorhanden? –

Antwort

5

Nachdem Sie

dotnet add reference ../HelloLib/HelloLib.csproj 

Sie tun müssen, eine zusätzliche

dotnet restore 

so die Referenzen tun richtig von dem Projekt verfolgt werden, wenn. Sie folgen Ihren gleichen Schritten, aber fügen Sie eine dotnet restore nach dem dotnet add reference Schritt es funktioniert fein.

Jedes Mal, wenn Sie Ihre Refrences ändern oder aktualisieren, müssen Sie danach dotnet restore anrufen oder Ihre dotnet build -Statement auf dotnet build /t:restore ändern, so dass es die Wiederherstellung vor dem Build für Sie tun wird.

+0

oo ... 'dotnet build/t: restore' scheint die magische Sauce zu sein, die mir fehlte. Danke ~ – Doug

Verwandte Themen