我正在构建一个C#.NET核心应用程序,它正在瞄准net452框架.当我发布时,我可以指定一个运行时( - runtime),如果我没有指定它使用的任何运行时win7-x64(我认为那是因为那是我的机器正在运行的).但是,我也可以手动指定运行时,它似乎接受我给它的任何字符串.然而,RID目录似乎表明两者win,以及any是否有效.
更新:我没有任何好的答案,所以我将澄清我的问题,并添加一个赏金.我也曾在ASP.NET核心论坛上问过,但没有得到回应.
如果我指定RID,win7-x32我的代码也会在64位Windows操作系统上运行吗?
如果我指定一个RID win7,它构建了什么,它将构建32位版本还是64位版本?
如果我指定RID win7,我的程序将在Windows 8,8.1或10中运行吗?
什么是anyRID吗?我理解可移植部署如何在多个平台上使用,但独立部署(使用RID构建any)如何在Linux和Windows上运行?我误解了这个RID吗?
如果我指定一个blah我预期错误的RID .相反,我的应用程序是在bin/Release/blah目录中构建的.它只是默认为其他运行时吗?
有人可以在csproj文件(VS2017)中解释这两个的目的:
<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>
Run Code Online (Sandbox Code Playgroud)
我刚从VS2015迁移,现在无法发布我的web api,因为它看起来我应该只使用一个目标框架.另外我不能指定多个RID.所有这些改变的事情让我感到沮丧.没有什么可以从头开始,应该一遍又一遍地克服一些东西.
我只想在Windows上开发我的web-api,在这里运行xUnit测试,然后部署web-api以在linux(ubuntu)服务器上运行.我应该在csproj的两个参数中加入什么?非常感谢与良好解释的链接.
UPDATE1
我有web api和引用的.net核心库.从VS2015迁移的所有东西.现在我有根项目
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>.当我通过VS2017发布时出现错误:
C:\ Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5):错误:如果未指定"发布"目标,则不支持目标框架.当前项目针对多个框架,请指定已发布应用程序的框架.
但我在发布时指定了目标框架 netcoreapp1.1.好.然后我<PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'">
<RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier>
</PropertyGroup>按照下面的建议更新了我的csproj .但是现在我甚至无法构建app,得到错误:
5> C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets(92,5):错误:资产文件'\ obj\project.assets.json'没有'.NETCoreApp,Version = v1.1/ubuntu.16.10-x64'的目标.确保已为TargetFramework ='netcoreapp1.1'和RuntimeIdentifier ='ubuntu.16.10-x64'恢复此项目.
我只想在Windows 8.1/windows7上使用VS2017进行开发并部署到ubuntu 16.10.我做错了什么?
UPDATE2
我有8个项目正在解决.其中3个是xUnit测试.因此我们有5个项目.这5个中的4个是类库,1个是我的web-app.所有4个类库都有:
<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我的网络应用:
<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
如何发布我的网络应用程序?
.net-core asp.net-core asp.net-core-webapi visual-studio-2017 runtime-identifier
当我发布我的.NET Core应用程序时,它会输出一个runtimes包含以下子目录的目录:
- publish/runtimes/
- debian.8-x64/
- fedora.23-x64/
- fedora.24-x64/
- opensuse.13.2-x64/
- opensuse.42.1-x64/
- osx/
- osx.10.10-x64/
- rhel.7-x64/
- ubuntu.14.04-x64/
- ubuntu.16.04-x64/
- ubuntu.16.10-x64/
- unix/
- win/
Run Code Online (Sandbox Code Playgroud)
在我的CI/CD服务器上,我使用以下命令发布我的应用程序:
dotnet publish -c Release -o ..\publish
Run Code Online (Sandbox Code Playgroud)
我在项目文件中的发布设置如下:
我只计划在Windows 2016 Server上发布此应用程序,因此runtimes不需要OSX/Linux/Unix 文件夹.更糟糕的是,在某些情况下,这些runtimes文件夹包含dlls导致OSA扫描误报的已知易受攻击.
有没有办法将项目配置为仅输出win运行时文件夹?
更新
我已经尝试了@ahsteele的建议,并且将RID添加到我的csproj文件的输出与我没有指定RID的情况相同.
当我运行CI/CD命令示例时
dotnet publish -c Release -r win10-x86 -o ..\publish
Run Code Online (Sandbox Code Playgroud)
我相信它创建了一个自包含的部署.我的发布目录从55MB变为120MB,从237个文件变为482个文件.
更新2
我已经尝试为发布步骤指定我的启动项目,并且它将运行时目录构建得更紧凑.
这是我正在运行的构建命令:
dotnet publish .\startupProject.csproj -c Release -o ..\publish
Run Code Online (Sandbox Code Playgroud)
这是输出:
- …Run Code Online (Sandbox Code Playgroud) 我有一个.NET Core Console应用程序.我的目标是能够有条件地DLLImport调用一个函数并调用它,但仅限于Windows运行时.
我想也许如果我可以访问csproj文件中的运行时标识符,我可以有条件地为该运行时定义一个常量,然后在我的c#中我可以包围DLLImport并调用#if/ #endifblocks.
是否可以csproj根据构建项目的运行时间在一个内部设置编译常量?这是针对<Project Sdk="Microsoft.NET.Sdk">以.NET Core为目标的SDK风格的项目格式(以其开头).
注意:这个问题很接近,但适用于project.json样式项目.
或者,是否有更好的方法来实现我的目标?