我正在尝试创建一个托管库,并将其与Nuget打包。该托管库使用C语言编写的另一个DLL文件,通过[ DllImport] P/Invoke 调用进行调用。在项目的根目录中,我有如下文件夹结构:
- root/runtimes/win-x86/native/file.dll
- root/runtimes/win-x64/native/file.dll
我没有使用.nuspec 文件,而是从.NET标准2.0项目的.csproj 文件生成 Nuget 包。我在.csproj 文件中包含了这些文件。
<ItemGroup>
<Content Include="runtimes\**" PackagePath="runtimes" Visible="true" />
</ItemGroup>
这个nuget包在lib/netstandard2.0目录中有托管的DLL,甚至在root/runtimes/RID/native目录中有未管理的DLL。使用该nuget包的项目可以完美安装并且没有错误地构建。
消费者将要使用的托管DLL尝试像这样使用本地DLL:
[DllImport("file_name.dll")]
private static extern IntPtr CscanHOpen(string connectionString);
//...
public void Open(string connectionString, int port) {
_handle = CscanHOpen(connectionString, port);
}
我在安装Nuget包时遇到了“找不到文件”的错误提示,当我查看构建目录时,发现没有那个非托管DLL文件。我尝试使用targets文件将非托管DLL文件复制到消费项目的输出目录中,但它从未出现。
obj/project.assets.json
文件。文件顶部有两个部分(json键):targets
和libraries
。libraries
部分列出了包中的所有文件,因此即使您在其中找到了 dll 文件,也没有任何意义。请在文件的targets
部分中查找您的包。它应该具有编译和运行时属性,其中包含 NuGet 选择的任何文件。如果您的本机 dll 没有列出,则 .net sdk 的其余部分将不会知道它。资产文件还应提供有关项目存在哪些 RID 的提示(请查看 targets 对象的直接子项)。 - zivkanProjectReference
(PR) 项目创建的,可以是 SDK 样式或传统的项目文件。packages.config
项目不支持 NuGet 的运行时内容。我不确定在使用 PR 的传统项目中是否适用。最好的方法是使用 SDK 样式项目(创建一个 .NET Core 项目,然后编辑 csproj 并将目标框架更改为net472
)。 - zivkan