Flutter Desktop调用第三方C# DLL及32位DLL适配问题求助
Flutter Desktop调用第三方C# DLL及32位适配解决方案
核心问题分析
你遇到的System.EntryPointNotFoundException错误,本质是C# DLL默认是托管程序集,没有原生函数导出表,而FFI和DllImport都是针对原生(非托管)DLL设计的,直接用DllImport引用托管C# DLL的方法必然失败。
方案一:C++/CLI桥接层(推荐)
C++/CLI是.NET和原生代码的中间层,既能调用托管C#代码,又能导出原生函数给Flutter FFI调用,步骤清晰:
- 在Visual Studio创建「CLR类库」项目(C++/CLI类型)
- 右键项目→添加引用→浏览选择第三方C# DLL
- 编写原生导出函数,内部调用C#方法:
#include "pch.h" using namespace System; using namespace ClassLibrary1; // 替换为第三方DLL的命名空间 // 导出原生函数,供Flutter FFI调用 extern "C" __declspec(dllexport) int mysum(int a, int b) { return SumClass::sum(a, b); // 调用C#静态方法 }
- 项目属性设置为x64平台编译(匹配Flutter Windows的64位要求)
- Flutter端调用该C++/CLI生成的DLL,代码如下:
typedef AddFunc = Int32 Function(Int32 a, Int32 b); typedef Add = int Function(int a, int b); const dll = 'CppBridge.dll'; // 替换为你的C++/CLI DLL名称 final library = DynamicLibrary.open(dll); final addPointer = library.lookup<NativeFunction<AddFunc>>('mysum'); final add = addPointer.asFunction<Add>(); final result = add(_counter, 2);
方案二:C#包装器改用反射调用托管DLL
如果坚持用C#做包装,不能用DllImport引用托管DLL,要通过反射加载并调用其方法,修改你的C#包装器代码:
using System.Reflection; public class Class1 { [DllExport] public static Int32 mysum(Int32 a, Int32 b) { // 加载第三方托管DLL(确保路径正确,可使用绝对路径) Assembly targetAssembly = Assembly.LoadFrom("ClassLibrary1.dll"); // 获取目标类和静态方法 Type sumClass = targetAssembly.GetType("ClassLibrary1.SumClass"); MethodInfo sumMethod = sumClass.GetMethod("sum", BindingFlags.Public | BindingFlags.Static); // 调用方法并返回结果 return (Int32)sumMethod.Invoke(null, new object[] { a, b }); } }
注意:需保证第三方C# DLL与FlutterBridge.dll处于同一目录,或指定完整路径。
32位DLL适配方案
Flutter Windows仅支持64位进程,针对只有32位版本的第三方DLL,有两种可行方案:
- 进程外调用:编写一个32位的独立服务程序(如控制台应用),让它加载32位DLL,Flutter通过IPC机制(命名管道、Socket、gRPC等)与该服务通信,间接调用DLL功能。
- 获取64位版本:直接联系读卡器厂商,索要64位版本的DLL,这是最简洁的解决方案。
内容的提问来源于stack exchange,提问作者StefanoV827
相关产品推荐
相关产品推荐

