我正在尝试创建一个托管库并将其与 Nuget 打包。托管库使用另一个用 C 编写的 DLL,并通过 [DllImport] P/Invoke 调用进行调用。在项目的根目录中,我有一个类似以下的文件夹结构:
我没有使用 .nuspec 文件,而是从 .NET STandard 2.0 项目的 .csproj 文件生成 Nuget 包。我将这些文件包含在 .csproj 文件中。
<ItemGroup>
<Content Include="runtimes\**" PackagePath="runtimes" Visible="true" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
我从安装 nuget 包的项目中收到“文件无法找到”错误,当我查看构建目录时,我没有看到该非托管 DLL。我尝试使用目标文件将非托管 DLL 复制到使用项目的输出目录,但它从未显示。
从我的 Dockerfile调用dotnet restore <project>会导致NU1301: Unable to load the service index for source错误。我已经解决了许多建议的类似问题,并且仍然存在问题。以下是我所能提供的有关我尝试过的尽可能多的信息:
RUN ping google.com成功(这样我就可以访问互联网)nuget.org击球效果非常好RUN curl <nuget_feed_url>成功--verbosity detailed不会提供任何其他错误消息,但会提供一条错误消息这是有问题的 Dockerfile 部分
FROM mcr.microsoft.com/dotnet/aspnet:6.0.13 AS base
# Create dockeruser in base layer
RUN addgroup --system --gid 1000 dockergroup \
&& adduser --system --uid 1000 --ingroup dockergroup --shell /bin/sh dockeruser
WORKDIR /app
EXPOSE 8080
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
# Arguments are …Run Code Online (Sandbox Code Playgroud)