多年来,我们通过在包含该项目所有源代码的目录中的每个平台创建项目,在这些平台之间共享我们的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项目。)
答案 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>