// 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();
}
}
2条答案
按热度按时间yzxexxkh1#
这真的很难发现自己,但实际上你可以绑定这些库到你的MSIX.在我的情况下,我只是做了一个包标签打印机使用飞镖FFI和DLL's提供的制造商,这是我怎么做到的.
你需要从你的软件包中把这些DLL添加到
pubspec.yaml
上的assets
设置。通过这个设置,你将把DLL文件嵌入到你最终的MSIX中,但这是很容易的部分。现在你必须确保在代码中正确加载这些文件。根据我自己的测试,我仍然处理两种方法来开发和测试代码,第一种是当我通过
flutter run
在我的机器上运行一个项目时,我必须为当前的.path设置目标,当我完成它并开始为部署而构建时,我将其更改为resolvedExecutable.parent.path。您需要在哪里执行此操作。在开发环境中加载DLL(flutter run
):在生产环境中(从安装的.exe或MSIX运行):
用这个名为
_packageAssetsDirPath
的var以后将很容易加载你的DLL,现在你调用一个DynamicLibrary构造函数:此时,您可以加载一个DLL并使用它,您可以在https://github.com/saviobatista/argox_printer处检查我包的完整代码,在函数
_setupDll()
处检查lib/src/ppla.dart
,您将看到加载。k3bvogb12#
我根据Sávio Batista的解决方案设计了一个更简单的方案
(You必须在资产文件夹中有您的.dll)
只需将libturbojpeg.dll替换为您的.dll