我正在尝试使用.net核心编译和运行我的第一个跨平台应用程序来迁移c#app。我试图在Debian第9.3版上运行它
我已经运行了这两个命令。
dotnet build -r debian-x64
dotnet publish -c release -r debian-x64
dotnet build -r linux-x64
dotnet publish -c release -r linux-x64
我得到了每个文件夹,分别是(bin \ Release \ netcoreapp2.0 \ linux-x64和bin \ Release \ netcoreapp2.0 \ debian-x64),我使用SFTP复制到我的linux盒子。 在linux中,我进入该文件夹并运行。\ program
尝试使用debian特定或通用linux编译代码时出现以下错误。
Error:
An assembly specified in the application dependencies manifest (nfz_core.deps.json) was not found:
package: 'runtime.linux-x64.Microsoft.NETCore.App', version: '2.0.0'
path: 'runtimes/linux-x64/lib/netcoreapp2.0/Microsoft.CSharp.dll'
我想我可能在我的csproj文件中做错了什么,但我似乎无法弄清楚我做错了什么。
这是我的.csproj文件
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<RuntimeIdentifiers>win10-x64;debian-x64;linux-x64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
我感谢人们给予的任何见解。
答案 0 :(得分:2)
当你跑步时:
dotnet publish -c release -r linux-x64
您要求将此代码发布为Self Contained Deployment。这意味着所有.NET Core运行时,所有依赖项以及基本上与OS无关的任何内容都将与您的应用程序一起发布。 publish命令将您的构建置于:
bin\Release\netcoreapp2.0\linux-x64\publish
注意: 与bin\Release\netcoreapp2.0\linux-x64\
相同。 linux-x64
目录包含dotnet build
的输出,而不是dotnet publish
。
复制publish
目录后,您可以直接在目标操作系统上运行程序(./program
),而无需安装.NET Core。
另一种方法是以Framework Dependent Deployment模式运行。在这种情况下,您在没有-r linux-x64
的情况下构建。在这种情况下,您仍然会复制publish
目录,但必须以dotnet /path/to/your.dll
运行该应用程序。
TLDR:部署时始终复制publish
目录。
答案 1 :(得分:0)
@ omajid的回答很有帮助。
请注意,如果您希望进行框架相关部署(FDD),则必须从.csproj文件中删除<RuntimeIdentifiers>
/ <RuntimeIdentifier>
个元素。
此类FDD较小,因为它们不捆绑*.so
和System.*.dll
文件。对于最小项目,您可能只需要部署四个文件(如果排除*.pdb
调试文件,则为三个)。这些部署可在运行时之间移植。