VB.NET中OPC UA安全连接Lambda参数BC36641错误求助
解决VB.NET中Lambda参数BC36641错误(OPC UA客户端证书验证)
将C#的OPC UA客户端配置代码转换为VB.NET后,在证书验证的事件处理代码行出现BC36641错误:
AddHandler config.CertificateValidator.CertificateValidation, Sub(s, e) e.Accept = e.Error.StatusCode = StatusCodes.BadCertificateUntrusted
错误提示:Lambda参数''隐藏了封闭块中的变量、先前定义的范围变量或查询表达式中隐式声明的变量。
解决方案
显式声明Lambda表达式的参数类型,避免编译器的类型推断与外部范围变量产生冲突。修改后的代码如下:
If config.SecurityConfiguration.AutoAcceptUntrustedCertificates Then AddHandler config.CertificateValidator.CertificateValidation, Sub(s As Object, e As CertificateValidationEventArgs) e.Accept = (e.Error.StatusCode = StatusCodes.BadCertificateUntrusted) End Sub End If
原因说明
VB.NET的隐式类型参数(未声明类型的s和e)可能与当前代码块中已存在的同名变量,或是编译器隐式推断的变量产生作用域冲突,导致BC36641错误。通过显式指定参数的具体类型(Object和CertificateValidationEventArgs),可以明确参数的作用域,解决冲突问题。
完整修正后的VB.NET代码片段
Console.WriteLine("Configuring UA Client") Dim config = New ApplicationConfiguration() With { .ApplicationName = "OPC_Client_SQL", .ApplicationUri = Utils.Format("urn:{0}:OPC_Client_SQL", System.Net.Dns.GetHostName()), .ApplicationType = ApplicationType.Client, .SecurityConfiguration = New SecurityConfiguration With { .ApplicationCertificate = New CertificateIdentifier With { .StoreType = "Directory", .StorePath = "%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", .SubjectName = "OPC_Client_SQL" }, .TrustedIssuerCertificates = New CertificateTrustList With { .StoreType = "Directory", .StorePath = "%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" }, .TrustedPeerCertificates = New CertificateTrustList With { .StoreType = "Directory", .StorePath = "%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" }, .RejectedCertificateStore = New CertificateTrustList With { .StoreType = "Directory", .StorePath = "%CommonApplicationData%\OPC Foundation\CertificateStores\RejectedCertificates" }, .AutoAcceptUntrustedCertificates = True }, .TransportConfigurations = New TransportConfigurationCollection(), .TransportQuotas = New TransportQuotas With { .OperationTimeout = 15000 }, .ClientConfiguration = New ClientConfiguration With { .DefaultSessionTimeout = 60000 }, .TraceConfiguration = New TraceConfiguration() } config.Validate(ApplicationType.Client).GetAwaiter().GetResult() If config.SecurityConfiguration.AutoAcceptUntrustedCertificates Then AddHandler config.CertificateValidator.CertificateValidation, Sub(s As Object, e As CertificateValidationEventArgs) e.Accept = (e.Error.StatusCode = StatusCodes.BadCertificateUntrusted) End Sub End If
内容的提问来源于stack exchange,提问作者DL-PLP
相关产品推荐
相关产品推荐

