Совместное использование кода C# между WPF, UWP, Phone 81 и 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". Добавьте ссылку на ".NETFramework,Version=v4.6.1" в разделе "frameworks" вашего project.json, а затем повторно запустите восстановление NuGet. DSI.Applications.Base
После некоторого A/B-тестирования я обнаружил, что могу исправить ошибку, используя nuget, чтобы удалить ссылку UWP на Microsoft.NETCore.UniversalWindowsPlatform. Конечно, это нарушает проект UWP. Project.json отсутствует вообще.
Есть ли обходной путь, который позволит нам продолжить совместное использование кода таким способом? Рефакторинг наших общих проектов для размещения всех платформ будет огромным бременем - таких проектов много, таких как этот, некоторые из которых используются даже для дополнительных платформ (наш проект ASP.Net).
1 ответ
В нашем случае виновной была промежуточная папка obj. Сборка нашего проекта WPF не удалась, только если артефакты сборки UWP остались в папке obj. Ошибка действительно привела меня к проблеме, но не напрямую. Как указывалось в ошибке, в каталоге проекта не было файла project.json, но в папке obj был файл project.assets.json. Я удалил все содержимое obj как раз перед новой сборкой WPF, и это удалось.
Для размещения нашего общего каталога я изменил промежуточный (и bin) каталог сборки UWP на 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>