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