如何实现Flutter Windows Desktop与C# UWP桥接?从HelloWorld入门
Flutter调用UWP C#代码实现HelloWorld示例
由于UWP基于Windows Runtime(WinRT),无法直接使用普通C# DLL,需要通过WinRT组件实现Flutter与C#的桥接,以下是完整步骤:
1. 创建UWP WinRT组件项目
打开Visual Studio,新建项目并选择「Windows Runtime Component (C#)」,命名为FlutterUwpBridge。将你的HelloWorld代码调整为如下(添加WebHostHidden特性避免元数据冲突):
using System; using Windows.Foundation.Metadata; namespace FlutterUwpBridge { [WebHostHidden] public sealed class HelloWorld { public static string GetMessage() { return "Hello, World from C#!"; } } }
2. 编译WinRT组件
选择对应架构(如x64)编译项目,编译完成后,在项目的bin/x64/Debug(或Release)目录下会生成:
FlutterUwpBridge.winmd:WinRT元数据文件FlutterUwpBridge.dll:组件实现文件FlutterUwpBridge.lib:链接库文件
3. Flutter Windows项目配置
将上述编译产物复制到Flutter项目的windows/uwp_bridge/x64/Debug目录(自行创建对应文件夹),然后修改windows/runner/CMakeLists.txt,添加WinRT组件的引用:
# 引入UWP WinRT组件 add_library(FlutterUwpBridge SHARED IMPORTED) set_target_properties(FlutterUwpBridge PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/uwp_bridge/x64/Debug/FlutterUwpBridge.dll" IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/uwp_bridge/x64/Debug/FlutterUwpBridge.lib" INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/uwp_bridge/x64/Debug/" ) # 将组件链接到Flutter运行目标 target_link_libraries(${BINARY_NAME} PRIVATE FlutterUwpBridge)
4. 实现Flutter与C#的方法调用
Windows端C++通道代码
修改windows/runner/main.cpp,注册MethodChannel并调用C#方法:
#include <winrt/FlutterUwpBridge.h> using namespace winrt::FlutterUwpBridge; // 在FlutterWindow::OnCreate方法中添加以下代码 auto channel = std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>( flutter_controller_->engine()->messenger(), "com.example/uwp_bridge", &flutter::StandardMethodCodec::GetInstance()); channel->SetMethodCallHandler( [](const flutter::MethodCall<flutter::EncodableValue>& call, std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) { if (call.method_name() == "getMessage") { // 调用C# WinRT静态方法 winrt::hstring csharpMessage = HelloWorld::GetMessage(); // 转换为std::string返回给Flutter std::string messageStr(csharpMessage.begin(), csharpMessage.end()); result->Success(flutter::EncodableValue(messageStr)); } else { result->NotImplemented(); } });
Flutter Dart端代码
创建桥接类并调用方法:
import 'package:flutter/services.dart'; class UwpBridge { static const _channel = MethodChannel('com.example/uwp_bridge'); static Future<String?> getMessage() async { try { return await _channel.invokeMethod<String>('getMessage'); } on PlatformException catch (e) { return '调用失败: ${e.message}'; } } } // 在Widget中使用示例 // final message = await UwpBridge.getMessage();
注意事项
- 确保Flutter项目的编译架构(如x64)与WinRT组件的编译架构完全一致,否则会出现链接错误
- WinRT组件的最低Windows版本需与Flutter Windows项目的目标版本匹配
- 不要使用普通C#类库项目,必须用Windows Runtime Component,才能被WinRT环境识别调用
内容的提问来源于stack exchange,提问作者robotmr
相关产品推荐
相关产品推荐

