所以我想利用 Brotli,但我不熟悉 Python 和 C++..
我知道有人将它编译成 Windows .exe。但是我如何将它包装到 DLL 或 .NET 应用程序可以引用的东西中呢?我知道有 IronPython,我是否只是将所有源文件引入 IronPython 项目并编写一个调用 Brotli API 并公开它们的 .NET 适配器?但实际上,我什至不确定 Brotli API 是 Python 还是 C++。
查看tools/bro.cc
,似乎在encode.c
和decode.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/