首页 > 解决方案 > msbuild 如何从多框架 nuget 包中解析程序集?

问题描述

我有一个带有ConsoleApp-net461引用库的控制台应用程序的解决方案ClassLibrary-net452

这两个项目都引用了一个多框架 nuget 包NuGetPackage-net452-net461

当我构建时,我最终在输出文件夹中得到了 nuget 包的 net461 dll。在运行时,我收到如下错误:

System.TypeLoadException: Inheritance security rules violated by type: 'ClassA'. 
Derived types must either match the security accessibility of the base type or be less accessible.

我怀疑这是因为我ClassLibrary-net452最终依赖于带有 net461 框架的 nuget 包 dll。

这是正常行为吗?确保从 nuget 包中解析 net452 dll 的最佳方法是什么?BindingRedirects 似乎不允许您选择目标框架。

标签: msbuildnugetnuget-package

解决方案


不是 100% 确定这会起作用,但可能值得尝试:

(依赖于使用 SDK csproj 格式,链接可能适用于 packages.config,但我对该区域知之甚少。)

看起来你想要的是这样的。然而,dotnet/SDK 团队还没有开始实施它。

建议的解决方法是:
- 从包引用中获取 dll 路径
- 告诉包引用不要复制编译资产 (dll)。
- 使用 dll 路径为重定向到包的 Net452 版本的非包引用生成类似路径。

此处此处的解释性链接。

总结是你的 csproj 应该包含这样的东西:

<ItemGroup>
    <PackageReference Include="*MyPackageName*" ExcludeAssets="Compile" GeneratePathProperty="true">
        <Version>x.y.z</Version>
    </PackageReference>
</ItemGroup>

<ItemGroup>
    <Reference Include="*NameYouWantToGiveThisReference(suggest dll name)*">
  <HintPath>$(Pkg*MyPackageName*)lib\net452\*DLLname*.dll</HintPath>
</Reference>

** 包围的所有内容都需要根据您的项目实际名称来命名。
两个MyPackageName必须匹配(需要注意的是,第一个中的所有“.”都应替换为第二个中的“_”)。


推荐阅读