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

如何编写C#可执行文件启动Azure Functions本地运行实例?

针对Azure Functions本地托管的两种实现方案

方案1:作为子进程启动(借助Azure Functions Core Tools)

这种方式通过调用官方的Azure Functions Core Tools,将函数服务作为子进程启动,适合不想改动原有Functions项目配置的场景。

前提条件

确保已安装Azure Functions Core Tools(Visual Studio创建Functions项目时通常会自动安装,也可手动部署)。

编写控制台可执行程序

创建一个新的控制台应用项目,使用以下代码实现子进程启动:

using System.Diagnostics;

// 若Core Tools未加入系统PATH,需指定完整路径,可通过命令行`where func`查询
var funcExecutablePath = "func";
// 指定Functions项目构建后的输出目录(需包含host.json、local.settings.json)
var functionsWorkingDir = @"C:\YourFunctionsProject\bin\Debug\net6.0";

var startInfo = new ProcessStartInfo
{
    FileName = funcExecutablePath,
    Arguments = "start",
    WorkingDirectory = functionsWorkingDir,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};

using var funcProcess = Process.Start(startInfo);
if (funcProcess == null)
{
    Console.WriteLine("无法启动Azure Functions服务进程");
    return;
}

// 实时输出函数服务的日志和错误信息
funcProcess.OutputDataReceived += (_, e) => 
{
    if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine(e.Data);
};
funcProcess.ErrorDataReceived += (_, e) => 
{
    if (!string.IsNullOrEmpty(e.Data)) Console.WriteLine($"[错误] {e.Data}");
};
funcProcess.BeginOutputReadLine();
funcProcess.BeginErrorReadLine();

// 等待子进程退出
funcProcess.WaitForExit();
Console.WriteLine($"函数服务已退出,退出码: {funcProcess.ExitCode}");

方案2:进程内部托管(自托管模式)

这种方式无需依赖Core Tools,直接在自定义进程内托管Azure Functions服务,适合需要高度集成的场景。

步骤1:调整Functions项目配置

打开你的Azure Functions项目的.csproj文件,确保包含以下配置和包引用:

<PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <FunctionsWorkerRuntime>dotnet-isolated</FunctionsWorkerRuntime>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.19.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.14.0" OutputItemType="Analyzer" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <!-- 根据你的函数类型添加对应的扩展包,比如HTTP函数需添加下面的包 -->
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
</ItemGroup>

步骤2:添加自托管启动代码

在Functions项目中添加Program.cs文件(若已存在则替换内容):

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    // 可在此添加自定义服务配置
    .Build();

await host.RunAsync();

步骤3:运行或嵌入到自定义应用

  • 直接运行:构建Functions项目后,会生成对应的可执行文件,直接启动即可运行函数服务。
  • 嵌入到自定义应用:在你的主应用中引用Functions项目的DLL,通过以下代码启动托管服务:
using Microsoft.Extensions.Hosting;

var funcHost = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

// 启动进程内的Azure Functions服务
await funcHost.RunAsync();

注意事项

  • 确保输出目录下存在local.settings.json,配置必要的参数(如AzureWebJobsStorage可设为UseDevelopmentStorage=true使用本地存储模拟器)。
  • 若你原项目是In-Process模式(基于Microsoft.NET.Sdk.Functions),建议迁移到孤立进程模式,In-Process模式依赖外部宿主,难以实现进程内托管。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:41:06