如何在flutter构建窗口中包含dll

wf82jlnq  于 2022-11-25  发布在  Flutter
关注(0)|答案(2)|浏览(382)

我正在做一个flutter项目,在开发中运行良好。但是我不知道如何让构建包含使用FFI引用的dll。
我找不到如何做这件事的明确说明。
我试着按照这些步骤构建一个msix here,它可以工作,但似乎不包括dll(它以与常规构建相同的方式失败)
在构建过程中考虑dll的过程是什么?
其他dll的显示在构建目录中从第三方软件包,所以一定有一个方法,对吗?

yzxexxkh

yzxexxkh1#

这真的很难发现自己,但实际上你可以绑定这些库到你的MSIX.在我的情况下,我只是做了一个包标签打印机使用飞镖FFI和DLL's提供的制造商,这是我怎么做到的.
你需要从你的软件包中把这些DLL添加到pubspec.yaml上的assets设置。

[...]
flutter:
  [...]
  assets:
    - assets/WinPort.dll
    - assets/Winppla.dll
    - assets/Winpplb.dll
    - assets/Winpplz.dll

通过这个设置,你将把DLL文件嵌入到你最终的MSIX中,但这是很容易的部分。现在你必须确保在代码中正确加载这些文件。根据我自己的测试,我仍然处理两种方法来开发和测试代码,第一种是当我通过flutter run在我的机器上运行一个项目时,我必须为当前的.path设置目标,当我完成它并开始为部署而构建时,我将其更改为resolvedExecutable.parent.path。您需要在哪里执行此操作。在开发环境中加载DLL(flutter run):

final String _packageAssetsDirPath = normalize(join(Directory.current.path,'assets'));

在生产环境中(从安装的.exe或MSIX运行):

final String _assetsPackageDir = normalize(
      join('data', 'flutter_assets', 'packages', 'YOUR_PACKAGE_NAME', 'assets'));
  final String _exeDirPath = File(Platform.resolvedExecutable).parent.path;
  final String _packageAssetsDirPath =
      normalize(join(_exeDirPath, _assetsPackageDir));

用这个名为_packageAssetsDirPath的var以后将很容易加载你的DLL,现在你调用一个DynamicLibrary构造函数:

// Path for DLL file
final String _libDllSourceFullPath =
      normalize(join(_packageAssetsDirPath, 'Winppla.dll'));
// Target for copy, place DLL in same place the .exe you are running
final String _libDllDestFullPath =
      normalize(join(_packageAssetsDirPath, 'YOUROWN.dll'));
// Try to copy for running exe path
File(_libDllSourceFullPath).copySync(_libDllDestFullPath);

// With this copy, would be simple to load, and if it fails, try in full path
// LOAD DLL
  try {
    String _packageAssetsDirPath =
        normalize(join(Directory.current.path, 'assets'));
    String _printerLibraryPath =
        normalize(join(_packageAssetsDirPath, 'Winppla.dll'));

    DynamicLibrary _library = DynamicLibrary.open(_printerLibraryPath);
    return _library;
  } catch (e) {
    try {
      DynamicLibrary _library = DynamicLibrary.open('Winppla.dll');
      return _library;
    } catch (e) {
      // Avoing errors creating a fake DLL, but you could deal with an exception
      return DynamicLibrary.process();

    }
  }

此时,您可以加载一个DLL并使用它,您可以在https://github.com/saviobatista/argox_printer处检查我包的完整代码,在函数_setupDll()处检查lib/src/ppla.dart,您将看到加载。

k3bvogb1

k3bvogb12#

我根据Sávio Batista的解决方案设计了一个更简单的方案
(You必须在资产文件夹中有您的.dll)

if (kReleaseMode) {
    // I'm on release mode, absolute linking
    final String local_lib =  join('data',  'flutter_assets', 'assets', 'libturbojpeg.dll');
    String pathToLib = join(Directory(Platform.resolvedExecutable).parent.path, local_lib);
    DynamicLibrary lib = DynamicLibrary.open(pathToLib);
  } else {
    // I'm on debug mode, local linking
    var path = Directory.current.path;
    DynamicLibrary lib = DynamicLibrary.open('$path/assets/libturbojpeg.dll');
  }

只需将libturbojpeg.dll替换为您的.dll

相关问题