Использование ValueTuple с PackageReference в облачных службах Azure
Я пытаюсь преобразовать мои проекты на C# из старого в новый стиль csproj, но это нарушает мою облачную службу Azure во время выполнения, так как ReferenceAssembly из System.ValueTuple.dll
копируется вместо исполняющей сборки.
Это та же проблема, что описана в этом закрытом / заброшенном выпуске.
Поскольку мои проекты в настоящее время нацелены на.NET 4.6.2, проблема "решаема" путем нацеливания на.NET 4.7+, поскольку System.ValueTuple
и, следовательно, не нужно ссылаться на него как на пакет NuGet.
Я хотел бы избежать этой ситуации, если это возможно, так как:
- Для этого требуется дополнительный шаг развертывания, чтобы установить среды выполнения.net 4.7+ на рабочие роли, поскольку они поставляются с установленным.net 4.6.2. https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-guestos-update-matrix
- Это кажется "легким выходом", и я хотел бы знать, можно ли решить проблему иначе.
Дополнительное описание вопроса:
Я буду использовать:
refDLL
за:packages\system.valuetuple\4.5.0\ref\net461\System.ValueTuple.dll
, а такжеlibDLL
заpackages\system.valuetuple\4.5.0\lib\net461\System.ValueTuple.dll
,
Их легко отличить, так как refDLL
40 кб и libDLL
78 кб.
Фактический код и полный файл журнала сборки находятся здесь: https://www.dropbox.com/s/kquv5voa19jfonz/AzureCloudService1.zip?dl=0
У меня есть решение проблемы следующим образом:
- AzureCloudService1
- WorkerRole1 (старый csproj)
- WorkerRole2 (новый csproj)
После создания облачного сервиса
WorkerRole1\bin\Debug
имеетlibDLL
,WorkerRole2\bin\Debug\net461
имеетlibDLL
AzureCloudService1\obj\Debug\WorkerRole1
имеетlibDLL
AzureCloudService1\obj\Debug\WorkerRole2
имеетrefDLL
Из журналов я заметил следующую разницу между WorkerRole1 и WorkerRole2.
WorkerRole1:
C:\Users\jonas\source\repos\AzureCloudService1\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll
CopyLocal = true
FusionName = System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
HintPath = ..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll
ImageRuntime = v4.0.30319
MSBuildSourceProjectFile = C:\Users\jonas\source\repos\AzureCloudService1\WorkerRole1\WorkerRole1.csproj
MSBuildSourceTargetName = BuiltProjectOutputGroupDependencies
OriginalItemSpec = System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL
ReferenceAssembly = C:\Users\jonas\source\repos\AzureCloudService1\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll
ReferenceSourceTarget = ResolveAssemblyReference
ResolvedFrom = {HintPathFromItem}
Version = 4.0.3.0
WorkerRole2:
C:\Users\jonas\.nuget\packages\system.valuetuple\4.5.0\ref\net461\System.ValueTuple.dll
CopyLocal = false
ExternallyResolved = true
FusionName = System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
HintPath = C:\Users\jonas\.nuget\packages\system.valuetuple\4.5.0\ref\net461\System.ValueTuple.dll
ImageRuntime = v4.0.30319
MSBuildSourceProjectFile = C:\Users\jonas\source\repos\AzureCloudService1\WorkerRole2\WorkerRole2.csproj
MSBuildSourceTargetName = BuiltProjectOutputGroupDependencies
NuGetPackageId = System.ValueTuple
NuGetPackageVersion = 4.5.0
NuGetSourceType = Package
OriginalItemSpec = C:\Users\jonas\.nuget\packages\system.valuetuple\4.5.0\ref\net461\System.ValueTuple.dll
Private = false
ReferenceAssembly = C:\Users\jonas\.nuget\packages\system.valuetuple\4.5.0\ref\net461\System.ValueTuple.dll
ReferenceSourceTarget = ResolveAssemblyReference
ResolvedFrom = {HintPathFromItem}
Version = 4.0.3.0
После поиска других связанных проблем на различных средствах отслеживания проблем Microsoft я нашел этот, который кажется связанным: https://github.com/dotnet/sdk/issues/1738.