PostSharp无法在新的csproj中运行



在使用新的VS2017 csproj格式(.NET Core,Standard或Framework(的任何项目中,除非PostSharp是直接的NuGet依赖项,否则不会将各个方面编织到代码中。

例如,如果我创建一个依赖于 PubComp.Caching.AopCaching 的 .NET Core 项目,该项目依赖于 PostSharp,它将允许我使用 AopCaching NuGet 中定义的方面。该项目将编译,但PostSharp方面实际上并没有编织到代码中。使其工作的唯一方法是将PostSharp安装为直接NuGet依赖项。

我认为这与msbuild解析新csproj的NuGet依赖项的顺序以及PostSharp的IL代码编织发生的时间有关。

有谁确切知道为什么会发生这种情况?除了记住始终安装PostSharp之外,还有什么解决方案吗?

有问题的软件包在其.nuspec文件中使用以下对 PostSharp 的引用:

<dependency id="PostSharp" version="6.0.28" exclude="Build,Analyzers" />

这特别排除了PostSharp的构建脚本,这些脚本不会注入到构建中,因此不会执行PostSharp。这在非 SDK 项目中不会发生。

这可能是因为作者不希望他们的包导致依赖包全部执行PostSharp。

仅供参考; 如果您查看PostSharp的包结构,则每个包含方面的库都有两个包,例如PostSharp.Patterns.Common(构建时包(,它引用PostSharp.Patterns.Common.Redist(运行时包(。构建时包包含仅构建时组件,并引用PostSharp包包含所有构建时工具。运行时包包含运行时 DLL 并引用PostSharp.Redist包。

这允许依赖包选择是需要构建时还是运行时依赖关系图。

基于@Daniel Balas的这个伟大的答案, 我更进一步,即使在单个基础项目上导入时,也能PostSharp进行预编译。

我所要做的就是在 csproj 文件中导入PostSharp包时将build添加到包含的资产中

<PackageReference Include="PostSharp" Version="6.10.13">
<IncludeAssets>build</IncludeAssets>
<ExcludeAssets>none</ExcludeAssets>
<PrivateAssets>analyzers</PrivateAssets>
</PackageReference>

因此,在导入PubComp.Caching.AopCaching包时,也导入一次PostSharp包,并包含如上所述的构建资产。

这应该使PostSharp的显式导入在引用项目中是多余的。

最新更新