.NET Languages

It's possible to write your function in using different .NET languages (C#, Visual Basic, or F#). The core task is the same in all languages—you create a class implementing one of the Functions Framework interfaces:

This document provides examples for F# and Visual Basic.

Templates

Note that to run the examples in this document, you will use the templates:

  1. Install the .NET SDK.

  2. Install the template package:

    dotnet new install Google.Cloud.Functions.Templates 

Templates are provided for the three kinds of functions in C# (the default), F#, and Visual Basic. When creating a new project from a template, specify -lang f# to create an F# project, or -lang vb to create a Visual Basic project. For example, to create a new untyped CloudEvent function for Visual Basic, you would run:

dotnet new gcf-untyped-event -lang vb 

HTTP function examples

You use HTTP functions when you want to invoke your function via an HTTP(S) request. The following examples output the message "Hello World!"

F#

namespace HelloWorldFSharp open Google.Cloud.Functions.Framework open Microsoft.AspNetCore.Http type Function() =  interface IHttpFunction with  member this.HandleAsync context =  async {  do! context.Response.WriteAsync "Hello World!" |> Async.AwaitTask  } |> Async.StartAsTask :> _

Visual Basic

Imports Google.Cloud.Functions.Framework Imports Microsoft.AspNetCore.Http Public Class CloudFunction  Implements IHttpFunction  Public Async Function HandleAsync(context As HttpContext) As Task Implements IHttpFunction.HandleAsync  Await context.Response.WriteAsync("Hello World!")  End Function End Class

Project files for HTTP examples

Here are the project files for the above samples:

F#

<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>  <OutputType>Exe</OutputType>  <TargetFramework>net6.0</TargetFramework>  </PropertyGroup>  <ItemGroup>  <Compile Include="Function.fs" />  </ItemGroup>  <ItemGroup>  <PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.2.1" />  </ItemGroup> </Project>

Visual Basic

<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>  <OutputType>Exe</OutputType>  <RootNamespace>HelloWorldVb</RootNamespace>  <TargetFramework>net6.0</TargetFramework>  </PropertyGroup>  <ItemGroup>  <PackageReference Include="Google.Cloud.Functions.Hosting" Version="2.2.1" />  </ItemGroup> </Project>

Deploying the HTTP functions

F#

 gcloud functions deploy fsharp-helloworld --no-gen2 --entry-point HelloWorldFSharp.Function --runtime dotnet6 --trigger-http --allow-unauthenticated 

Visual Basic

 gcloud functions deploy vb-helloworld --no-gen2 --entry-point HelloWorldVb.CloudFunction --runtime dotnet6 --trigger-http --allow-unauthenticated 

CloudEvent examples

You use CloudEvent functions when you want to have your Cloud Run function invoked indirectly in response to an asynchronous event, such as a message on a Pub/Sub topic, a change in a Cloud Storage bucket, or a Firebase event.

F#

namespace HelloPubSubFSharp open Google.Cloud.Functions.Framework open Google.Events.Protobuf.Cloud.PubSub.V1 open Microsoft.Extensions.Logging open System open System.Threading.Tasks type Function(logger: ILogger<Function>) =  interface ICloudEventFunction<MessagePublishedData> with  member this.HandleAsync(cloudEvent, data, cancellationToken) =  let nameFromMessage = data.Message.TextData  let name = if String.IsNullOrEmpty(nameFromMessage) then "world" else nameFromMessage  logger.LogInformation("Hello {name}", name)  Task.CompletedTask

Visual Basic

Imports System.Threading Imports CloudNative.CloudEvents Imports Google.Cloud.Functions.Framework Imports Google.Events.Protobuf.Cloud.PubSub.V1 Imports Microsoft.Extensions.Logging Public Class CloudFunction  Implements ICloudEventFunction(Of MessagePublishedData)  Private _logger As ILogger  Public Sub New(ByVal logger As ILogger(Of CloudFunction))  _logger = logger  End Sub  Public Function HandleAsync(cloudEvent As CloudEvent, data As MessagePublishedData, cancellationToken As CancellationToken) As Task _  Implements ICloudEventFunction(Of MessagePublishedData).HandleAsync  Dim nameFromMessage = data.Message?.TextData  Dim name = If(String.IsNullOrEmpty(nameFromMessage), "world", nameFromMessage)  _logger.LogInformation("Hello {name}", name)  Return Task.CompletedTask  End Function End Class

Deploying the CloudEvent functions

F#

 gcloud functions deploy fsharp-hello-pubsub --no-gen2 --entry-point HelloPubSubFSharp.Function --runtime dotnet6 --trigger-topic my-topic --allow-unauthenticated 

Visual Basic

 gcloud functions deploy vb-hello-pubsub --no-gen2 --entry-point HelloPubSubVb.CloudFunction --runtime dotnet6 --trigger-topic my-topic --allow-unauthenticated 

Test the CloudEvent examples

You can test the CloudEvent examples as follows:

  1. Publish a message to your Pub/Sub topic to trigger your function:

    gcloud pubsub topics publish my-topic --message Flurry
  2. Look at the logs:

    gcloud functions logs read --limit 10

You should see something like this, with a message that includes the name you published to the Pub/Sub topic:

D my-function ... Function execution started I my-function ... Hello Flurry! D my-function ... Function execution took 39 ms, finished with status: 'ok'