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

VS2022本地运行Azure Functions时触发TypeLoadException运行时异常

问题:本地运行Azure Functions时出现TypeLoadException错误

在Microsoft Visual Studio Enterprise 2022中本地运行Azure Functions时,先弹出提示:

调试器正在尝试定位源文件,请等待...C:..\src\Microsoft.Azure.WebJobs.Host\Hosting\WebJobServiceCollectionExtensions.cs

提示框自动关闭后,在WebJobsServiceCollectionExtensions.cs中抛出运行时异常,内部异常为:

TypeLoadException: Could not load type 'Microsoft.Azure.WebJobs.ParameterBindingData' from assembly 'Microsoft.Azure.WebJobs, Version=3.0.34.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

完整异常堆栈:

System.Reflection.TargetInvocationException
  HResult=0x80131604
  Message=Exception has been thrown by the target of an invocation.
  Source=System.Private.CoreLib
  StackTrace:
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Span`1& arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
   at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   at DryIoc.ReflectionFactory.<>c__DisplayClass21_0.<GetActivator>b__1()
   at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.ReflectionFactory.CreateServiceExpression(MemberInfo ctorOrMember, Expression factoryExpr, Expression[] paramExprs, Request request)
   at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.WrappersSupport.GetArrayExpression(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.Factory.GetDelegateOrDefault(Request request)
   at DryIoc.Container.ResolveAndCacheDefaultFactoryDelegate(Type serviceType, IfUnresolved ifUnresolved)
   at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, IfUnresolved ifUnresolved)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.Azure.WebJobs.WebJobsServiceCollectionExtensions.<>c.<AddWebJobs>b__2_0(IServiceProvider p) in Microsoft.Azure.WebJobs\WebJobsServiceCollectionExtensions.cs:line 40
   at DryIoc.Registrator.<>c__DisplayClass27_0.<RegisterDelegate>b__0(IResolverContext r)
   at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Factory.ApplyReuse(Expression serviceExpr, Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.Factory.GetDelegateOrDefault(Request request)
   at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args)
   at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Factory.ApplyReuse(Expression serviceExpr, Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.Factory.GetDelegateOrDefault(Request request)
   at DryIoc.Container.ResolveAndCacheDefaultFactoryDelegate(Type serviceType, IfUnresolved ifUnresolved)
   at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, IfUnresolved ifUnresolved)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.Azure.WebJobs.WebJobsServiceCollectionExtensions.<>c.<AddWebJobs>b__2_6(IServiceProvider p) in Microsoft.Azure.WebJobs\WebJobsServiceCollectionExtensions.cs:line 68
   at DryIoc.Registrator.<>c__DisplayClass27_0.<RegisterDelegate>b__0(IResolverContext r)
   at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Factory.ApplyReuse(Expression serviceExpr, Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.Factory.GetDelegateOrDefault(Request request)
   at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args)
   at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder)
   at DryIoc.Factory.ApplyReuse(Expression serviceExpr, Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request)
   at DryIoc.Factory.GetExpressionOrDefault(Request request)
   at DryIoc.Factory.GetDelegateOrDefault(Request request)
   at DryIoc.Container.ResolveAndCacheDefaultFactoryDelegate(Type serviceType, IfUnresolved ifUnresolved)
   at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, IfUnresolved ifUnresolved)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
   at Microsoft.Azure.WebJobs.Script.WebHost.WebJobsScriptHostService.<UnsynchronizedStartHostAsync>d__52.MoveNext()

控制台输出:

Azure Functions Core Tools
Core Tools Version:       4.0.4653 Commit hash: N/A  (64-bit)
Function Runtime Version: 4.6.1.18388

相关代码片段:

函数类代码

using System.IO;
using System.Threading.Tasks;
using Central.Functions.FileLoader.Services.Interfaces;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;

namespace Central.Functions.FileLoader.Functions
{
    public class ProductLoader
    {
        private readonly IProductService _productService;

        public ProductLoader(IProductService productService)
        {
            _productService = productService;
        }

        [FunctionName("ProductLoader")]
        public async Task ProductLoaderFunction(
            [BlobTrigger("%ProductBlobIncomingContainerName%/{name}", Connection = "BlobConnectionString")] Stream blobStream,
            [Blob("%ProductBlobArchiveContainerName/{name}", FileAccess.Write)] Stream archiveBlob,
            string name,
            ILogger log)
        {
            log.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Size: {blobStream.Length} Bytes");
            try
            {
                string fileName = Path.GetFileNameWithoutExtension(name);
                await _productService.ProcessFileAsync(blobStream, archiveBlob, fileName, log);
            }
            catch (Exception ex)
            {
                log.LogError($"Error processing blob: {ex.Message}");
                throw;
            }
        }
    }
}

服务处理代码

public async Task ProcessFileAsync(Stream fileStream, Stream archiveStream, string fileName, ILogger log)
{
    log.LogInformation($"Processing file asynchronously...");

    using (var reader = new StreamReader(fileStream))
    {
        var header = await reader.ReadLineAsync();

        while (!reader.EndOfStream)
        {
            var line = await reader.ReadLineAsync();
            var values = line.Split('|');

            var productLine = new ProductLine
            {
                ID = values[0],
                Code = values[1],
                Description = values[2]
            };

            // 省略后续处理逻辑
        }
    }
}

已尝试操作:

  • 更新Visual Studio 2022至最新版本
  • 更新Azure开发工具

解决方案

这个错误是程序集版本不匹配导致的:ParameterBindingData类型在较新版本的Microsoft.Azure.WebJobs中存在,但当前加载的是3.0.34.0版本,该版本中没有这个类型,而依赖它的组件(比如Azure Functions Runtime 4.x)需要更高版本的Microsoft.Azure.WebJobs。

按以下步骤解决:

  1. 清理项目依赖并统一版本

    • 打开项目的csproj文件,检查所有Microsoft.Azure.WebJobs相关包的版本,确保它们与Azure Functions Runtime 4.x兼容(建议使用4.x系列的对应包版本,比如Microsoft.Azure.WebJobs 3.0.38+或更高,或者直接使用Microsoft.NET.Sdk.Functions包来统一管理)。
    • 如果项目中直接引用了Microsoft.Azure.WebJobs,将其版本更新为与Microsoft.NET.Sdk.Functions匹配的版本(比如Microsoft.NET.Sdk.Functions 4.x对应的Microsoft.Azure.WebJobs最低版本通常是3.0.38)。
  2. 清理NuGet缓存并重新还原

    • 在Visual Studio中,点击菜单工具 > NuGet包管理器 > 包管理器设置,找到NuGet包管理器 > 常规,点击清除所有NuGet缓存。
    • 右键项目,选择还原NuGet包,等待所有依赖重新下载。
  3. 删除bin和obj目录

    • 关闭Visual Studio,手动删除项目目录下的bin和obj文件夹,重新打开项目并编译。
  4. 检查Azure Functions Core Tools版本

    • 虽然控制台显示的Core Tools版本是4.0.4653(属于4.x系列),但可以尝试更新到最新版本:打开命令提示符,运行func extensions install,或者直接覆盖安装最新的Core Tools。
  5. 确认依赖注入配置无冲突

    • 检查项目的Startup.cs或Program.cs中的依赖注入配置,确保没有手动注册与WebJobs内部组件冲突的服务,避免导致程序集加载异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:09:54