在WPF,UWP,Phone 81和Compact Framework之间共享C#代码

时间:2017-06-27 21:51:34

标签: .net wpf uwp code-sharing

多年来,我们通过在包含该项目所有源代码的目录中的每个平台创建项目,在这些平台之间共享我们的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项目的错误(尽管WPF项目中没有包含UWP项目文件的事件):

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

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

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

1 个答案:

答案 0 :(得分:0)

在我们的例子中,中间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>