2

我正在尝试创作一个可以添加到 .net 4.0 或 4.5 项目中的 NuGet 包。包中包含的实际程序集都是针对 .net 3.5 构建的,除了针对 .net 4.0 构建的程序集之外 - 我无法控制这一点,因此我必须“按原样”使用程序集。

我正在处理的项目目标是 .net 4.5.2,并且需要引用这些“旧”程序集。我通过在我的 App.config 中添加以下内容启用了“旧版运行时激活”:

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>

这一切似乎都运作良好。现在,我希望将我的“旧”程序集打包到 NuGet 包中。我的 .nuspec 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
    <metadata>
        <!-- many lines elided for clarity -->
        <references>
            <group>
                <reference file="NetFx35Assembly1.dll" />
                <reference file="NetFx35Assembly2.dll" />
            </group>
            <group targetFramework=".NETFramework4.5.2" >
                <reference file="NetFx40Assembly.dll" />
            </group>
         </references>
    </metadata>
    <files>
        <!-- .net 3.5 assemblies -->
        <file src="NetFx35Assembly1.dll" target="lib\net35\NetFx35Assembly1.dll" />
        <file src="NetFx35Assembly2.dll" target="lib\net35\NetFx35Assembly2.dll" />
        <!-- .net 4.0 assemblies -->        
        <file src="NetFx40Assembly.dll" target="lib\net40\NetFx40Assembly.dll" />
    </files>
</package>

我的期望是,当我将此包添加到我的 .net 4.5.2 项目中时,它会执行以下操作:

  1. 引用 3.5 程序集,因为它们位于未指定任何框架的“默认”组中
  2. 引用 4.0 程序集,因为它是在以 4.5.2 为目标的组中指定的

事情并没有像我预期的那样顺利。我实际上得到的是对 4.0 程序集的单一引用。

创作我想要的行为的正确方法是什么?如何使 NuGet 包确保<startup useLegacyV2RuntimeActivationPolicy="true">标记存在于 App.config 文件中?

4

1 回答 1

1

对于参考组,NuGet 将仅为一个组安装所有项目。如果有更具体的匹配,它不会安装没有指定任何框架的组。如果项目的目标框架没有其他匹配项,则使用此默认组。

此外,除非 .NET 4.0 程序集仅针对 .NET 4.5.2,否则我可能不会在 NuGet 包中明确定位 .NET 4.5.2。如果它们与 .NET 4.0 兼容,我会让它们以 .NET 4.0 为目标

        <group targetFramework="net35">
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
        </group>
        <group targetFramework="net40" >
            <reference file="NetFx35Assembly1.dll" />
            <reference file="NetFx35Assembly2.dll" />
            <reference file="NetFx40Assembly.dll" />
        </group>

请注意,以上内容等同于没有在元数据部分中定义的引用,而只是使用:

<files>
    <!-- .net 3.5 assemblies -->
    <file src="NetFx35Assembly1.dll" target="lib\net35" />
    <file src="NetFx35Assembly2.dll" target="lib\net35" />
    <!-- .net 4.0 assemblies -->        
    <file src="NetFx35Assembly1.dll" target="lib\net40" />
    <file src="NetFx35Assembly2.dll" target="lib\net40" />
    <file src="NetFx40Assembly.dll" target="lib\net40" />
</files>

对于 app.config 文件,我会考虑使用XML 文档转换来添加启动元素。

于 2014-09-16T08:33:15.630 回答