Skills Plugins MCP Prompt Model 博客 我的中心
Development #javascript #api #web

maui-hybridwebview

Guidance for embedding web content in .NET MAUI apps using HybridWebView, including JavaScript–C# interop, bidirectional communication, raw messaging, and trimming/NativeAOT considerations. USE FOR: "HybridWebView", "JavaScript interop", "embed web content", "JS to C# interop", "C# to JavaScript", "web view interop", "raw message", "InvokeJavaScriptAsync", "web content MAUI". DO NOT USE FOR: deep linking from external URLs (use maui-deep-linking), REST API calls (use maui-rest-api), or Blazor Hybrid apps (different from HybridWebView).

DeepseekModel Curated skill Quality Excellent · 78 v1.0.0

Get

https://deepseekmodel.com/api/download.php?id=davidortinau-maui-skills-plugins-maui-skills-skills-maui-hybridwebview-skill-md&format=skill
Download .skill Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name maui-hybridwebview description Guidance for embedding web content in .NET MAUI apps using HybridWebView, including JavaScript–C# interop, bidirectional communication, raw messaging, and trimming/NativeAOT considerations. USE FOR: "HybridWebView", "JavaScript interop", "embed web content", "JS to C# interop", "C# to JavaScript", "web view interop", "raw message", "InvokeJavaScriptAsync", "web content MAUI". DO NOT USE FOR: deep linking from external URLs (use maui-deep-linking), REST API calls (use maui-rest-api), or Blazor Hybrid apps (different from HybridWebView). HybridWebView in .NET MAUI HybridWebView hosts HTML/JS/CSS content inside a .NET MAUI app with bidirectional C#↔JS communication. It is not a general browser control — it is designed for local web content shipped with the app. Common gotchas Issue Fix Blank white screen Web assets missing from Resources/Raw/wwwroot or DefaultFile not set JS interop silently fails Missing <script src="_hwv/HybridWebView.js"></script> in HTML InvokeJavaScriptAsync returns null Return type missing [JsonSerializable] attribute in JsonSerializerContext JS → C# calls do nothing SetInvokeJavaScriptTarget not called before JS invokes C# methods Serialization crash with trimming Not using source-generated JsonSerializerContext ⚠️ Bridge script is mandatory The HTML page must include the bridge script before any app scripts: <!-- ✅ Correct order --> < script src = "_hwv/HybridWebView.js" > </ script > < script src = "scripts/app.js" > </ script > <!-- ❌ Wrong — app.js loads before bridge, interop calls fail silently --> < script src = "scripts/app.js" > </ script > < script src = "_hwv/HybridWebView.js" > </ script > JSON serialization — every type must be registered Every parameter type and return type used in InvokeJavaScriptAsync must have a [JsonSerializable] entry: // ✅ Correct — all interop types registered [ JsonSerializable(typeof(int)) ] [ JsonSerializable(typeof(string)) ] [ JsonSerializable(typeof(Person)) ] internal partial class MyJsonContext : JsonSerializerContext { } // ❌ Wrong — adding a new type to interop without registering it // This causes silent null returns or runtime exceptions Rule : When you add a new type to the interop surface, you must add a [JsonSerializable(typeof(T))] attribute to the context. Forgetting this is the #1 cause of mysterious interop failures. SetInvokeJavaScriptTarget — timing matters // ✅ Set target BEFORE the web page loads and JS calls C# myHybridWebView.SetInvokeJavaScriptTarget( new MyJsBridge()); // ❌ Setting it after JS already tried to call — calls are lost ⚠️ Call SetInvokeJavaScriptTarget during page construction or OnAppearing , not lazily. Exception handling (.NET 9+) JS exceptions thrown during InvokeJavaScriptAsync are forwarded to .NET. Always wrap interop calls: // ✅ Catches JS errors try { var result = await myHybridWebView.InvokeJavaScriptAsync< string >( "riskyFunction" , MyJsonContext.Default.String); } catch (Exception ex) { Debug.WriteLine( $"JS error: {ex.Message} " ); } // ❌ Unhandled JS exception crashes the interop pipeline var result = await myHybridWebView.InvokeJavaScriptAsync< string >( "riskyFunction" , MyJsonContext.Default.String); Trimming / NativeAOT pitfalls Trimming is disabled by default in MAUI projects. If you enable it: ⚠️ You must use source-generated JsonSerializerContext (not reflection-based serialization) ⚠️ Set JsonSerializerIsReflectionEnabledByDefault to false Using JsonSerializerContext as shown above is recommended regardless of trimming settings < PropertyGroup > < PublishTrimmed > true </ PublishTrimmed > < JsonSerializerIsReflectionEnabledByDefault > false </ JsonSerializerIsReflectionEnabledByDefault > </ PropertyGroup > Decision framework — typed interop vs raw messages Need Use Structured data exchange with type safety InvokeJavaScriptAsync / InvokeDotNet with JsonSerializerContext Simple string payloads, fire-and-forget SendRawMessage / RawMessageReceived Calling C# from JS with return values InvokeDotNet (target must be set first) Multiple JS functions to call Typed interop — one InvokeJavaScriptAsync per function Quick checklist Web content is under Resources/Raw/wwwroot index.html includes <script src="_hwv/HybridWebView.js"></script> before app scripts DefaultFile is set (or defaults to index.html ) Every interop type has a [JsonSerializable] entry in a JsonSerializerContext SetInvokeJavaScriptTarget is called before JS invokes C# methods InvokeJavaScriptAsync calls are wrapped in try/catch (.NET 9+) If trimming enabled: source-generated JSON serialization configured
Keywords that activate this skill. Click one to copy it.

This skill does not provide trigger words.

The downloaded .skill package contains the following fields.
Field Description
formatFormat tag (skill/v1)
skill_idUnique skill ID
nameSkill name
versionVersion
descriptionDescription
categoryCategories (array)
trigger_wordsTrigger words
tagsTags
sourceSource
source_urlSource URL (this page)
exported_atExported at (set per download)
system_promptSystem prompt body
model_configModel config: provider / model / temperature / max_tokens / top_p
examplesExamples
install_guideImport guide for Coze / Dify / Claude / custom frameworks
The same skill can be exported in different platform formats.
.skill Standard format with system_prompt and model_config, ready for any agent framework Download
.skillpro Enhanced format with scripts, tools, dependencies and hooks Download
.json Plain JSON export with system_prompt and model parameters only Download
Coze Markdown with frontmatter, for Coze platform import Download
Dify Dify DSL, import directly after creating an app Download

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

验证码 --

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。