编写必须添加对旧框架程序集的引用的NuGet包的正确方法是什么?

时间:2014-09-15 19:00:26

标签: nuget nuspec

我正在尝试创建一个可以添加到.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
  3. 为目标的组中指定的

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

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

1 个答案:

答案 0 :(得分: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 document transform来添加启动元素。