编译.Net Core VS17

Oll*_*ing 5 c# .net-core visual-studio-2017

在过去的几天里,我一直在尝试编译我的.net核心控制台应用程序,并将其上传到运行"Windows Server 2012 R2"的vps.我使用.Net Core的原因是因为库需要它 - Discord.Net 1.0.

我尝试的第一件事就是使用以下文件结构来获取我的发布dll和数据:

LeveledStudios.deps
LeveledStudios.dll
LeveledStudios.pdb
LeveledStudios.runtimeconfig.dev
LeveledStdios.runtimeconfig
Run Code Online (Sandbox Code Playgroud)

这在我开发它的PC上执行得很好,然而我进入我的服务器,运行"dotnet LeveledStudios.dll",并面临错误

Error: assembly specified in the dependencies manifest was not found -- package: 'discord.net.commands', version '1.0.0-rc-00546', path: 'lib/netstandard1.3/Discord.Net.Commands.dll`
Run Code Online (Sandbox Code Playgroud)

注意到这适合我的开发PC上的.nuget文件夹的结构,我将其复制并面临同样的问题,并尝试将其复制到与leveledstudios.dll相同的文件夹中,只是遇到一些拒绝工作的.dll文件.这还包括缺少系统dll,如System.Net.Http等.

我做了一些谷歌搜索,并看到有关自包含的.net核心应用程序的信息.这听起来很完美,因为很明显我的问题是它没有编译我所有的额外库.我有点困惑,因为我没有project.json文件,正如我在其上阅读的所有文档中所提到的.

但是在运行时:

dotnet restore
dotnet build -r win10-x64
Run Code Online (Sandbox Code Playgroud)

我收到许多错误,建议没有编译任何系统库:

错误

LeveledStudios.csproj的内容:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="**\*.cs" />
    <EmbeddedResource Include="**\*.resx" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Discord.Net" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.Commands" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.Core" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.WebSocket" Version="1.0.0-rc-00546" />
    <PackageReference Include="Microsoft.NETCore.App" Version="1.0.1" />
    <PackageReference Include="Newtonsoft.Json" Version="9.0.2-beta2" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

如果有人有任何处理.Net核心的经验并且可以给出一些指导,我将不胜感激.

Sha*_*tin 1

...自包含的.NET Core应用程序[听起来]完美...但是...我收到许多错误,表明没有编译任何系统库。

要解决构建为独立应用程序时发生的错误,请将这一行添加到您的 *.csproj 文件中:

<RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>
Run Code Online (Sandbox Code Playgroud)

然后,恢复将降低运行时,允许您构建并发布为独立的应用程序。

dotnet restore
dotnet build -r win10-x64
dotnet publish -c release -r win10-x64
Run Code Online (Sandbox Code Playgroud)

最终的 *.csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <PropertyGroup>
    <OutputType>exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
    <RuntimeIdentifiers>win10-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="**\*.cs" />
    <EmbeddedResource Include="**\*.resx" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Discord.Net" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.Commands" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.Core" Version="1.0.0-rc-00546" />
    <PackageReference Include="Discord.Net.WebSocket" Version="1.0.0-rc-00546" />
    <PackageReference Include="Microsoft.NETCore.App" Version="1.0.1" />
    <PackageReference Include="Newtonsoft.Json" Version="9.0.2-beta2" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这就是如何发布为独立的应用程序,这是解决您的初始问题的一种替代方法。

另一种选择(Ryan 建议的并且您说不起作用)是使用依赖于框架的应用程序,在这种情况下您不需要该RuntimeIdentifiers属性。然后,您可以运行相同的命令,但无需指定运行时。

dotnet restore
dotnet build
dotnet publish
Run Code Online (Sandbox Code Playgroud)

包含Discord依赖项的发布文件将位于此处:

bin\Debug\netcoreapp1.0\publish
Run Code Online (Sandbox Code Playgroud)