如何从 UWP 应用程序调用“libheif.dll”函数

Posted

技术标签:

【中文标题】如何从 UWP 应用程序调用“libheif.dll”函数【英文标题】:How to call "libheif.dll" function from a UWP app 【发布时间】:2019-07-11 09:16:00 【问题描述】:

我正在尝试在我的 UWP 应用中使用 "libheif" library 来解码一些 HEIC 图像。 在 heif.h 中,我将闲置的 C++ 代码 extern "C" __declspec(dllexport) 添加到我想从 C# 代码调用的函数中:

    LIBHEIF_API
    extern "C" __declspec(dllexport) struct heif_context* heif_context_alloc(void);

    LIBHEIF_API
    extern "C" __declspec(dllexport) void heif_context_free(struct heif_context*);

    LIBHEIF_API
    extern "C" __declspec(dllexport) struct heif_error heif_context_read_from_file(struct heif_context*, const char* filename,
                                              const struct heif_reading_options*);

    ...

然后我将库编译成 DLL 文件并将其添加到我的 UWP 项目中。在 C# 代码中,我这样做了:

    namespace Libraries
    
        public class PInvokeCode
        
          [DllImport("ms-appx:///libheif.dll")]
          public static extern struct heif_context_alloc();

          [DllImport("ms-appx:///libheif.dll")]
          public static extern void heif_context_free(struct heif_context);

          [DllImport("ms-appx:///libheif.dll")]
          public static extern struct heif_error heif_context_read_from_file(struct heif_context*, const char* filename,
                                              const struct heif_reading_options*);

        
    

当然,在我的 UWP 中,我允许不安全的代码,并且我将 DLL 设置为内容。但是,我似乎仍然无法使代码正常工作。这是我第一次尝试这样的事情,我不知道我哪里出错了!

如果您需要,这里是libheif.dll 和heif.h 文件的链接。

【问题讨论】:

"...我似乎无法让代码工作...":您需要对此进行扩展,因为您所遇到的问题没有足够的详细信息有问题。 根据您想要对 HEIF 图像执行的操作,您不必自己进行解码。如果您有最新版本的 Windows 和/或安装了适当的 WIC 编解码器,则可以使用 WPF 的 BitmapImage 加载 HEIF,例如:new BitmapImage(new Uri(@"D:\Downloads\surfer_1440x960.heic")),与 UWP 相同 @SimonMourier HEIF 容器中可以有多个图像(like this Sample file),我正在尝试使用我的代码访问这些图像和缩略图 @RichardCritten 我发现的事情是围绕简单任务(比如用 int 做数学)而不是做复杂任务(将 HEIC 文件推送到 DLL 并获得图像序列作为回报)我只是得到如下错误: DllImport 在此声明类型上无效。它仅对“方法”声明有效。修饰符“静态”和“外部”对此项无效 我建议创建Windows Runtime Components 并引用libheif library 然后重新打包libheif api。将新的运行时组件添加到 uwp 项目中。 【参考方案1】:
    您必须确定应用程序是以 32 位还是 64 位运行的 申请。 然后确保 libheif.dll (main) 可以链接到位于同一目录 libde265.dll 的依赖 dll (解码器)和 libx265.dll(编码器)。 因此从 https://github.com/mcychan/libheif/releases/tag/1.6.2 如果有的话 上面提到的库不见了。

【讨论】:

以上是关于如何从 UWP 应用程序调用“libheif.dll”函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UWP 应用程序中创建 COM 对象? (C#)

从 UWP BackgroundTask 调用 MediaCapture.InitializeAsync

如何在win32 C++控制台应用程序中调用uwp类库

UWP 调用系统拍照程序

UWP:从共享目标共享

无法从 Android 调用 Web 服务,但它可以从 UWP 工作