我们已经在内部构建了一个类库,除其他外,它公开了一些专门用于授权其他请求(获取/刷新令牌等)的 HTTP 客户端。到目前为止,它已经构建为
netstandard2.1
,并且我们能够保持依赖项为最新状态,没有任何问题。
我们最近将一个额外的身份验证客户端类型从消费应用程序移植到此库中。现有的实现让客户端被
IAsyncActionFilter
实现使用,以便可以将其添加为方法上的属性:
[AttributeUsage(AttributeTargets.Method)]
public class OpaAuthAttribute : TypeFilterAttribute
{
public OpaAuthAttribute(string permission) : base(typeof(OpaAuthActionFilter))
{
Arguments = new object[] { permission };
}
}
这可行,但继续使用
netstandard2.1
TFM 让我们依赖于 Microsoft.AspNetCore.Mvc
v2.2.0。这确实不是一个很好的前进道路,因为该项目已经存档了 4 年,并且发布时它依赖于多个已知安全漏洞的库版本:
。
因此,我正在尝试找出可升级实现的路径,这意味着转向
net6.0
。我可以通过更改此设置来获取所有依赖项:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
...
对此:
<Project Sdk="Microsoft.NET.Sdk.Web"> <!-- Changed -->
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <!-- Changed -->
...
但是我在构建输出中仍然收到以下错误:
Program does not contain a static 'Main' method suitable for an entry point
是否可以创建使用最新版本的 ASP.Net MVC SDK 的类库?我错过了什么?
事实证明答案真的很微不足道:
Microsoft.NET.Sdk.Web
项目显然默认为
<OutputType>exe</OutputType>
因此,即使 MSBuild 的默认
OutputType
值是 Library
,因为我使用的是 Web SDK,所以我必须更新我的 .csproj 文件以明确声明我想要一个类库:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<OutputType>library</OutputType>
...
使用 Sdk="Microsoft.NET.Sdk.Web" 的缺点是 Visual Studio 会在每次项目加载时不断创建 launchsettings.json。这个问题可以通过使用
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
来解决
但是,还有另一种解决方案。相反,请使用 Sdk="Microsoft.NET.Sdk" 并使用
<FrameworkReference Include="Microsoft.AspNetCore.App" />
这是完整的示例:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
[更多此处][1]