Dynamo WebView Component Scaffold
You scaffold new Dynamo extension repos following the Switchboard pattern. The reference implementation is DynamoDS/Dynamo-Switchboard.
Project Structure
src/
{Product}.sln
Directory.Build.props # central: DynamoVersion, Product, deployment paths
common.tasks # ReplaceFileText MSBuild task
nuget.config # Autodesk Artifactory + nuget.org sources
{Product}.ViewExtension/ # net8.0-windows, IViewExtension + WebView2 host
{Product}.Messages/ # net8.0, shared C#/TS message types
{Product}.SystemTests/ # net8.0-windows, NUnit + SystemTestBase
{Product}.WebView/ # React + Vite + TypeScript frontend
packageItems/
pkg.json # template — version/name replaced at build time
extra/
{Product}_ViewExtensionDefinition.xml
scripts/
build.ps1 # TypeScript codegen → npm build → dotnet build
create-package-zip.ps1
tools/
WriteTypescript/ # Roslyn-based C# → TypeScript type generator
pipeline.yml # Jenkins: build → test → publish artifact
Package Output Structure
deploy/{Configuration}/{Product}/
bin/ # assemblies + dist/ (React build output)
extra/ # ViewExtensionDefinition.xml
pkg.json # populated at build time from Directory.Build.props
Key Patterns
ViewExtension
- Implements
IViewExtensionwithUniqueId,Startup,Loaded,Shutdown - Loads dependent assemblies in a custom
AssemblyLoadContextto avoid version conflicts - Accesses
IOAuth2AuthProviderandPathManagerfrom Dynamo viaViewLoadedParams
WebView2 hosting
Microsoft.Web.WebView2NuGet withExcludeAssets="runtime"(relies on system runtime)- User data folder:
{DynamoUserDataDir}/{Product}WebView - Additional browser arg:
--allow-file-access-from-files - Loads React app from
file://{bin}/dist/index.html
C# ↔ TypeScript messaging
WebViewMessagebase class with[JsonDerivedType]for polymorphic JSON- C# → TS:
CoreWebView2.PostWebMessageAsString(json) - TS → C#:
CoreWebView2.WebMessageReceivedevent - Types auto-generated from C# to TypeScript by WriteTypescript tool during build
System tests
- Inherit
SystemTestBasefrom DynamoVisualProgramming.Tests TestServices.dll.configwith%DynamoBasePath%placeholder replaced by MSBuild[SetUpFixture]registersAppDomain.AssemblyResolvefor Dynamo binaries- Tests load the actual built package from
src/deploy/{Configuration}/{Product}/ - NUnit STA apartment state required; JUnit XML output for CI reporting
Build
Directory.Build.propsdefinesDynamoVersion,Product,DeployTargetFolders- MSBuild targets:
CopyReactApp(AfterBuild),CopyOutputToPackageFolder(AfterBuild),CreatePkgJson(AfterBuild) build.ps1enforces order: WriteTypescript codegen →npm ci && npm run build→dotnet buildpipeline.yml: Jenkins, Windows node, weekly schedule, publishes{Product}.zipto Autodesk package manager
When scaffolding a new repo
- Replace all instances of
Switchboard/DynamoSwitchboardwith the new product name - Generate a new
UniqueIdGUID for the ViewExtension - Update
DynamoVersioninDirectory.Build.propsto the target Dynamo version - Update NuGet package sources in
nuget.configif the new repo uses different feeds - Stub out the Messages project with at minimum one message type in each direction
- Verify the ViewExtensionDefinition.xml AssemblyPath matches the output DLL name