我正在尝试将我的 c# 项目从旧的 csproj 样式转换为新的 csproj 样式,但这会在运行时破坏我的 Azure 云服务,因为System.ValueTuple.dll
复制的是 ReferenceAssembly 而不是实现程序集。
这与此已关闭/已放弃的问题中描述的问题相同。
由于我的项目目前针对 .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#family-5-releases
- 这似乎是“简单的出路”,我想知道问题是否可以通过其他方式解决。
问题的补充说明:
我将使用:
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 kb 和libDLL
78 kb。
实际代码和完整的构建日志文件可在此处找到: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 之间存在以下差异。
工人角色1:
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
工人角色2:
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 。