在使用新的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
的显式导入在引用项目中是多余的。