在 WPF、UWP、Phone81 和 Compact Framework 之间共享 C# 代码

Sharing C# code among WPF, UWP, Phone 81 and Compact Framework

多年来,我们通过在包含该项目所有源代码的目录中为每个平台创建项目,在这些平台之间共享我们的 C# 代码。当我们添加新平台时,如果包含的代码文件无法在新平台上编译,我们将创建代码文件的副本并对其进行修改,以便它可以在预期平台上运行。

项目目录可能如下所示

Application.Base
    Applications.Base.CF.csproj
    Applications.Base.WPF.csproj
    Applications.Base.Phone81.csproj
    Properties
        AssemblyInfo.cs
    Src
        WidgetWPF.cs
        WidgetPhone81.cs
        Widget.cs

现在,我对 UWP 采用相同的方法,并且 运行正在处理这个问题。为 UWP 添加新项目时:

Application.Base
    ....
    Applications.Base.UWP
    Properties
        AssemblyInfo.cs
        DSI.Applications.Base.UWP.rd.xml
    ...

现在,当我转到我的 WPF 解决方案时,我在编译 Applications.Base.WPF 项目时遇到错误(虽然没有 UWP 项目文件包含在 WPF 项目中):

您的项目未引用“.NETFramework,Version=v4.6.1”框架。在 project.json 的 "frameworks" 部分添加对“.NETFramework,Version=v4.6.1”的引用,然后重新 运行 NuGet 还原。 DSI.Applications.Base

经过一些 A/B 测试,我发现我可以通过使用 nuget 删除 UWP 对 Microsoft.NETCore.UniversalWindowsPlatform 的引用来修复错误。当然,这会破坏 UWP 项目。根本没有project.json存在。

是否有解决方法可以让我们继续以这种方式共享代码?重构我们的共享项目以适应所有平台将是一个巨大的负担 - 有许多这样的共享项目 - 其中一些甚至共享给其他平台(我们的 ASP.Net 项目。)

在我们的案例中,中间 obj 文件夹是罪魁祸首。仅当 UWP 构建的工件留在 obj 文件夹中时,构建我们的 WPF 项目才会失败。这个错误确实让我想到了问题,但不是直接的。如错误所示,项目目录中没有 project.json 文件,但在 obj 文件夹中有一个 project.assets.json 文件。我在新的 WPF 构建之前删除了所有 obj 内容并且它成功了。

为了容纳我们的共享目录,我通过修改项目文件将UWP构建的中间(和bin)目录更改为objUWP。没有找到直接在VS 2017中做的方法,所以直接修改工程xml:

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>binUWP\Debug\</OutputPath>
    <BaseIntermediateOutputPath>objUWP\</BaseIntermediateOutputPath>
    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>