c# - 将Brotli编译成DLL .NET可以引用

标签 c# python compression python.net brotli

所以我想利用 Brotli,但我不熟悉 Python 和 C++..

我知道有人将它编译成 Windows .exe。但是我如何将它包装到 DLL 或 .NET 应用程序可以引用的东西中呢?我知道有 IronPython,我是否只是将所有源文件引入 IronPython 项目并编写一个调用 Brotli API 并公开它们的 .NET 适配器?但实际上,我什至不确定 Brotli API 是 Python 还是 C++。

查看tools/bro.cc,似乎在encode.cdecode.c 中定义了“入口”方法作为 BrotliCompress()BrotliDecompressBuffer()BrotliDecompressStream() 方法。所以我想可以从 C++ 类编译 DLL。

最佳答案

为了避免使用 Python,我在这里 fork 了原始的 brotli 源代码 https://github.com/smourier/brotli并创建了一个可以与 .NET 一起使用的 Windows DLL 版本。 我添加了一个包含“WinBrotli”Visual Studio 2015 解决方案和两个项目的目录:

  • WinBrotli:包含原始未更改的 C/C++ brotli 代码的 Windows DLL(x86 和 x64)。
  • Brotli:用 C# 编写的 Windows 控制台应用程序(任何 Cpu),包含 WinBrotli 的 P/Invoke 互操作代码。

要重用 Winbrotli DLL,只需将 WinBrotli.x64.dll 和 WinBrotli.x86.dll(您可以在 WinBrotli/binaries 文件夹中找到已构建的发布版本)复制到您的 .NET 应用程序旁边,并将 BrotliCompression.cs 文件合并到您的 C# 项目中(或者如果 C# 不是您最喜欢的语言,则将其移植到 VB 或其他语言)。互操作代码将自动选择与当前进程的位数(X86 或 X64)相对应的正确 DLL。

完成后,使用起来相当简单(输入和输出可以是文件路径或标准 .NET 流):

        // compress
        BrotliCompression.Compress(input, output);

        // decompress
        BrotliCompression.Decompress(input, output);

为了创建 WinBrotli,这是我所做的(对于其他想要使用其他 Visual Studio 版本的人)

  • 创建了一个标准的DLL项目,移除了预编译头文件
  • 包括所有编码器和解码器原始 brotli C/C++ 文件(从未更改其中的任何内容,因此我们可以在需要时更新原始文件)
  • 配置项目以删除对 MSVCRT 的依赖(因此我们不需要部署其他 DLL)
  • 禁用 4146 警告(否则我们无法编译)
  • 添加了一个非常标准的 dllmain.cpp 文件,没有做任何特别的事情
  • 添加了一个 WinBrotli.cpp 文件,该文件将 brotli 压缩和解压缩代码暴露给外部 Windows 世界(具有非常薄的适配层,因此更容易在 .NET 中进行互操作)
  • 添加了导出 4 个函数的 WinBrotli.def 文件

关于c# - 将Brotli编译成DLL .NET可以引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075492/

相关文章:

python - 检查 dict 的复数值是否符合特定条件

python - 在Python中读取文件时如何自动处理解压?

java - 将 Zip 转换为存储压缩

c# - 随机串概率计算

c# - "Turning"一个 IEnumerable<IEnumerable<T>> 90 度

python - 使用 Django/Python 获得最大测试覆盖率的最佳实践?

javascript - 有没有办法判断 gzip 实际上是否在压缩特定文件?

c# - 孪生异常之谜

c# - 如何在 Outlook 中识别特定的约会项目

python - 在字典中对互斥 ID 进行分组