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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:40:01