You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BetaAnalyticsDataClient时遭遇冗长Grpc错误求助

VB.NET 创建 BetaAnalyticsDataClient 实例时的异常问题及解决办法

问题描述

正在编写VB.NET应用程序从Google Analytics拉取站点信息(因UA将于7月1日被GA4取代,原邮件获取方式已停用)。起初代码运行正常,但突然失效并抛出冗长错误,异常发生在创建BetaAnalyticsDataClient实例的代码处:

Dim Client As BetaAnalyticsDataClient = Await BetaAnalyticsDataClient.CreateAsync(CancellationToken.None)

错误栈信息

System.TypeInitializationException: The type initializer for 'Grpc.Core.Internal.UserAgentStringProvider' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Grpc.Core.Internal.PlatformApis' threw an exception. ---> System.IO.FileLoadException: Could not load file or assembly 'Xamarin.iOS' or one of its dependencies. An argument was out of its legal range. (Exception from HRESULT: 0x80131502) ---> System.ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length
   at System.String.Substring(Int32 startIndex, Int32 length)
   at GoogleAnalyticsMailer.My.MyApplication.MyResolveEventHandler(Object sender, ResolveEventArgs args) in C:\__CODE FOLDER\CURRENT DEVELOPMENT\GoogleAnalyticsMailer\ApplicationEvents.vb:line 42
   at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName)
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
   at System.Type.GetType(String typeName)
   at Grpc.Core.Internal.PlatformApis..cctor() in /var/local/git/grpc/src/csharp/Grpc.Core/Internal/PlatformApis.cs:line 87
   --- End of inner exception stack trace ---
   at Grpc.Core.Internal.PlatformApis.get_FrameworkDescription()
   at Grpc.Core.Internal.UserAgentStringProvider..cctor() in /var/local/git/grpc/src/csharp/Grpc.Core/Internal/UserAgentStringProvider.cs:line 34
   --- End of inner exception stack trace ---
   at Grpc.Core.Internal.UserAgentStringProvider.get_DefaultInstance()
   at Grpc.Core.Channel.EnsureUserAgentChannelOption(Dictionary`2 options) in /var/local/git/grpc/src/csharp/Grpc.Core/Channel.cs:line 321
   at Grpc.Core.Channel..ctor(String target, ChannelCredentials credentials, IEnumerable`1 options) in /var/local/git/grpc/src/csharp/Grpc.Core/Channel.cs:line 69
   at lambda_method(Closure , String , ChannelCredentials , GrpcChannelOptions )
   at Google.Api.Gax.Grpc.GrpcCoreAdapter.CreateChannelImpl(ServiceMetadata serviceMetadata, String endpoint, ChannelCredentials credentials, GrpcChannelOptions options) in /_/Google.Api.Gax.Grpc/GrpcCoreAdapter.cs:line 56
   at Google.Api.Gax.Grpc.GrpcAdapter.CreateChannel(ServiceMetadata serviceMetadata, String endpoint, ChannelCredentials credentials, GrpcChannelOptions options) in /_/Google.Api.Gax.Grpc/GrpcAdapter.cs:line 84
   at Google.Api.Gax.Grpc.ChannelPool.GetChannel(GrpcAdapter grpcAdapter, String endpoint, GrpcChannelOptions channelOptions, ChannelCredentials credentials) in /_/Google.Api.Gax.Grpc/ChannelPool.cs:line 99
   at Google.Api.Gax.Grpc.ChannelPool.<GetChannelAsync>d__9.MoveNext() in /_/Google.Api.Gax.Grpc/ChannelPool.cs:line 94
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Api.Gax.Grpc.ClientBuilderBase`1.<CreateCallInvokerAsync>d__78.MoveNext() in /_/Google.Api.Gax.Grpc/ClientBuilderBase.cs:line 393
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Analytics.Data.V1Beta.BetaAnalyticsDataClientBuilder.<BuildAsyncImpl>d__10.MoveNext() in /_/apis/Google.Analytics.Data.V1Beta/Google.Analytics.Data.V1Beta/BetaAnalyticsDataClient.g.cs:line 194
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
   at GoogleAnalyticsMailer.frmMain.VB$StateMachine_13_SendAnalytics.MoveNext() in C:\__CODE FOLDER\CURRENT DEVELOPMENT\GoogleAnalyticsMailer\frmMain.vb:line 224

额外说明

  • 错误中提到Xamarin.iOS,但并未针对该平台开发,推测这只是异常连锁反应的表象
  • 已正确配置GOOGLE_APPLICATION_CREDENTIALS环境变量指向合法的JSON密钥文件,此前代码运行正常

解决办法

  1. 修复自定义程序集解析逻辑
    错误栈显示异常根源在ApplicationEvents.vb第42行的MyResolveEventHandler中,String.Substring调用传入了负数长度参数。检查该事件中的字符串截取代码:

    • 确保在调用Substring前验证字符串长度,避免起始索引超出范围或长度为负数
    • 该事件尝试解析Xamarin.iOS程序集时触发错误,修正后可阻断后续连锁异常
  2. 更新相关NuGet包
    旧版本的Grpc或Google Analytics Data包可能存在平台检测bug,更新到最新稳定版:

    • 在NuGet包管理器中更新Google.Analytics.Data.V1Beta和Grpc.Core系列包
    • 清理项目后重新生成,避免旧文件冲突
  3. 显式指定Grpc适配器
    绕过Grpc的自动平台检测,使用基于HttpClient的REST适配器创建客户端:

    Dim builder As New BetaAnalyticsDataClientBuilder()
    builder.GrpcAdapter = Google.Api.Gax.Grpc.RestGrpcAdapter.Default
    Dim client As BetaAnalyticsDataClient = Await builder.BuildAsync(CancellationToken.None)
    
  4. 清理项目缓存

    • 删除项目的bin和obj目录,重新生成项目
    • 清除NuGet本地缓存,避免损坏的包文件导致加载异常

内容的提问来源于stack exchange,提问作者Scott McNair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:35:21