在 Nuget 中分发 DLL

问题描述 投票:0回答:1

我正在开发一个 C# 库 (LLamaSharp),它包装了一个 C++ 库 (llama.cpp)。

作为 nuget 包的一部分,我们包含使用所有各种类型的硬件支持(CUDA、OpenCL、Vulkan、AVX/AVX2/AVX512 等)编译的 DLL。在运行时,为可用硬件选择最好的后端。

您可以在此处查看当前文件夹层次结构以及其中的所有后端。自动选择取决于此精确布局,以便能够找到相关的 DLL。用于构建包的 nuspec 文件位于here

但是,使用当前设置,在发布“自包含”构建时会失败(在 Visual Studio 中:“构建”>“发布”,将部署模式设置为“自包含”)。它会产生这个错误:

Found multiple publish output files with the same relative path:
 - llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx\llama.dll,
 - llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx2\llama.dll,
 - llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx512\llama.dll,
 - llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\llama.dll

整个文件夹层次结构似乎被构建过程压平了。这会导致立即生成错误(多个文件进入同一位置),并且还会导致运行时选择失败(文件未放置在正确的文件夹中)。

通过 nuget 分发 DLL 的文件夹层次结构并在最终构建中保留结构的正确方法是什么?

c# .net nuget pinvoke
1个回答
0
投票

要将 DLL 文件夹保留在 NuGet 包中,请执行以下操作 >>

编辑

.nuspec
文件。添加带有路径的 DLL。 使用
contentFiles
设置路径。

示例:

<files>
  <file src="runtimes\win-x64\native\avx\llama.dll" target="runtimes\win-x64\native\avx\llama.dll" />
  <file src="runtimes\win-x64\native\avx2\llama.dll" target="runtimes\win-x64\native\avx2\llama.dll" />
  <file src="runtimes\win-x64\native\avx512\llama.dll" target="runtimes\win-x64\native\avx512\llama.dll" />
  <file src="runtimes\win-x64\native\llama.dll" target="runtimes\win-x64\native\llama.dll" />
</files>

这样可以保持文件夹结构并且不会出现扁平问题。

© www.soinside.com 2019 - 2024. All rights reserved.