C# Xamarin.Forms项目无法在Azure管道中生成

C# Xamarin.Forms项目无法在Azure管道中生成,c#,.net,xamarin.forms,xamarin.android,azure-devops,C#,.net,Xamarin.forms,Xamarin.android,Azure Devops,我有一个针对Android的Xamarin.Forms项目,我可以在本地构建/测试/部署/打包,没有任何错误,并且该应用程序在我的手机上运行良好。太好了 现在我想开始使用Azure DevOps Pipelines for CI,用向导创建了一个Xamarin管道,启动了管道,但由于编译错误而失败: /Users/vsts/agent/2.155.1/work/1/s/MyProject/MyService.cs(41,64): error CS1503: Argument 1: canno

我有一个针对Android的Xamarin.Forms项目,我可以在本地构建/测试/部署/打包,没有任何错误,并且该应用程序在我的手机上运行良好。太好了

现在我想开始使用Azure DevOps Pipelines for CI,用向导创建了一个Xamarin管道,启动了管道,但由于编译错误而失败:

  /Users/vsts/agent/2.155.1/work/1/s/MyProject/MyService.cs(41,64): error CS1503: Argument 1: cannot convert from 'char' to 'string' [/Users/vsts/agent/2.155.1/work/1/s/MyProject/MyProject.Android.csproj]
为什么它在本地建造,而不是在管道中建造?错误消息中引用的代码是以下函数:

var x = string.Join(',', nextStations);  // nextStations is IEnumerable<string>
我想这和这里问的问题是一样的:但这个问题没有真正的答案(这里切换到调试并不能解决问题),我发现了更多细节,即不同的框架版本

那么,你知道如何让管道建设这个项目吗

Visual Studio 2019,Xamarin.表单4.2.0.778463,Android目标框架v9.0

My azure-pipelines.yml文件供参考:

trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  buildConfiguration: 'Release'
  outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'

- task: XamarinAndroid@1
  inputs:
    projectFile: '**/*droid*.csproj'
    outputDirectory: '$(outputDirectory)'
    configuration: '$(buildConfiguration)'

我不知道为什么它会在本地机器上构建,但如果我不得不猜测的话,可能是因为您有一些缓存版本的代码,这些代码在某种程度上运行良好

尽管如此,如果查看
string.Join()
方法(对于NETStandard),您将看到没有将
char
作为第一个参数的重载。它们都使用
string
。因此,您需要做的是使用双引号,而不是单引号

我相信你的故障线路应该是这样的

var x=string.Join(“,”,nextStations);//请注意,双引号“”而不是单引号``
编辑:抱歉,我还没有阅读您的全部问题,我刚刚意识到您实际上提到您已经为.NET核心检查了
string.Join()
。然而,这是令人困惑的部分,您可能还没有意识到这一点,.NET内核与Mono(Xamarin框架)的兼容性部分是通过NETStandard完成的(请参阅)

兼容:.NET内核通过.NET标准与.NET Framework、Xamarin和Mono兼容

编辑2:更多链接

简言之,单声道兼容性->


关于Mono和.NET Core之间的差异的深入帖子->

我一周前也有同样的问题,我发现了。检查我的管道日志,我发现托管的MacOS使用的是mono版本5.12,因此我在XamarinAndroid任务之前添加了一个步骤,其中我设置了一个更新的版本,这是我的azure-pipelines.yaml文件:

trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  buildConfiguration: 'Release'
  outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      echo 'Selecting Mono version...'
      sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1
- task: XamarinAndroid@1
  inputs:
    projectFile: '**/*Droid*.csproj'
    outputDirectory: '$(outputDirectory)'
    configuration: '$(buildConfiguration)'
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(build.binariesDirectory)/$(buildConfiguration)'
    Contents: '*.apk'
    TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'
您可以找到更多信息和工具的版本


问候

当然可以。我知道我可以把那行从“,”改成“,”。但是,我得到了也使用.net核心函数的外部库的链接错误。由于它们是外部的,我无法修复它们(Xamarin.Plugin.FilePicker,>200k下载)<代码>错误MSB4018:Mono.Linker.MarkException:错误处理方法:“Plugin.FilePicker.IOUtil::GetPath(Android.Content.Context,Android.Net.Uri)”程序集中的:“Plugin.FilePicker.dll”-->Mono.Cecil.ResolutionException:未能解析System.String[]System.String::Split(System.Char,System.StringSplitOptions)所以我不需要关于.net核心和.net标准之间差异的信息。我很清楚:-)问题是,为什么编译行为在本地与管道中不同,我如何强制管道像本地msbuild一样工作?我的意思是,我在本地得到了一个可以运行的应用程序,我可以在我的Android设备上运行,没有任何问题——即使其中有那些功能。对于Xamarin来说,似乎有很多著名的NuGet软件包使用了这些函数,没有人抱怨它们。我不能相信这一切只是一个巨大的意外。
trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  buildConfiguration: 'Release'
  outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      echo 'Selecting Mono version...'
      sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1
- task: XamarinAndroid@1
  inputs:
    projectFile: '**/*Droid*.csproj'
    outputDirectory: '$(outputDirectory)'
    configuration: '$(buildConfiguration)'
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(build.binariesDirectory)/$(buildConfiguration)'
    Contents: '*.apk'
    TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'