3

非常令人沮丧,我有一个可移植类库 (PCL) 库,它必须在配置文件中删除 .NET 4.0 才能访问正确的 API 的“PCL 领域”。但是,这些 API 确实存在于 .NET 4.0 中,因此如果完全相同的代码位于 .NET 4.0 项目中,则它编译得很好。

我想要一种最小的持续维护方式来将此 PCL 项目中的代码重新编译为 .net 4.0,以便我可以将其包含在 Nuget 包中。

4

2 回答 2

8

只需对.csproj.

构建项目:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup> 
        <ProjectToBuild Include="MyPortableSolution.sln">
            <Properties>Configuration=Release;</Properties>
        </ProjectToBuild>
        <ProjectToBuild Include="MyPortableSolution.sln">
            <Properties>Configuration=Release;OutputPath=bin\Release.net40\;IntermediateOutputPath=obj\Release.net40\;UseNet40=true;</Properties>
        </ProjectToBuild>
    </ItemGroup>
    <Target Name="Build">
        <MSBuild Projects="@(ProjectToBuild)"/>
    </Target>
</Project>

在 MyPortableProj.csproj 的两个区域进行更改:

第一次替换:

<TargetFrameworkProfile>Profile46</TargetFrameworkProfile>

和:

<UseNet40 Condition=" '$(UseNet40)' == '' ">false</UseNet40>
<TargetFrameworkProfile Condition="$(UseNet40) == false">Profile46</TargetFrameworkProfile>

第二次替换:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />

和:

<Import Condition="$(UseNet40) == true" Project="$(SolutionDir)\refs.targets" />
<Import Condition="$(UseNet40) == true" Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Condition="$(UseNet40) == false" Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />

包括一个refs.targets

这是一个包含您需要的程序集引用的文件(从项目编辑到项目)

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Reference Include="mscorlib" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System" />
    <Reference Include="System.Core" />
  </ItemGroup>
</Project>

注意:使用单独的文件,因为 Visual Studio 会解析并以其他方式显示它。

msbuild Build.proj

这将在其中创建您的可移植库bin\Release和 .net 40 特定库bin\Release.net40

于 2013-05-30T00:15:19.537 回答
3

我想这个问题没有“一刀切”的答案。

作为第一步,尝试pcl 分析器以查看有多少类型和方法不属于 4.0 配置文件可能会很有用

  • 如果它只有几种方法,那么您也许可以使用较低配置的 pcl 以及少量特定于平台的抽象来找到前进的方法。
  • 但是如果有很多不兼容的地方,那么您可能需要找到一些文件链接或项目文件转换解决方案。
于 2013-05-26T14:32:25.617 回答