.Net 插件架构不适用于 Nuget

Posted

技术标签:

【中文标题】.Net 插件架构不适用于 Nuget【英文标题】:.Net Plugin Architecture Not Working with Nuget 【发布时间】:2020-11-19 03:48:48 【问题描述】:

我有一个加载插件的 .Net Core 3.1 控制台应用程序。我的一个插件连接到 Sqlite,因此它对 Microsoft.Data.Sqlite 有 Nuget 依赖。但是,在加载/运行插件时,我从控制台应用程序中收到了缺少的 DLL 异常,因为以下路径不存在:

MyConsoleApp\bin\x86\Debug\netcoreapp3.1\runtimes\win-x86\native\e_sqlite3.dll

我还有一个测试这个 Sqlite 插件项目的 MsTest 项目。它没有同样的问题。显然,如果 Visual Studio 项目 (1) 是某种可执行文件并且 (2) 具有相关的 Nuget 或项目引用,则 runtimes 文件夹和内容将自动存在。

按照这些规则,我的三个 Visual Studio 项目中有两个没有运行时文件夹:

插件对 Microsoft.Data.Sqlite 有 Nuget 依赖,但没有 runtimes 文件夹,因为插件项目是 DLL...不是可执行文件。 测试 Sqlite 插件的 MsTest 项目 确实 具有 runtimes 文件夹和内容,因为 (1) 它是一种可执行文件,并且 (2) 它具有对插件的项目引用项目(它又引用 Nuget 包)。 主控制台应用程序是可执行文件,但(故意)没有对插件的项目引用。因此它没有runtimes 文件夹。

我该如何解决这个问题?作为 hack,我只是将丢失的 DLL 复制到控制台应用程序的输出目标目录中。

另外,如果我将控制台应用程序中的项目引用添加到插件中,这个问题就解决了。但是,如前所述,我不希望控制台应用程序具有对任何插件的项目引用。插件应该是动态发现的。我认为解决此问题可能与创建 nuspec 文件有关。但是,the documentation for nuspec files 没有关于解决此问题的评论。

【问题讨论】:

您的插件项目类型是什么?您的控制台应用程序如何使用插件? 嗨,关于这个问题的任何更新? 【参考方案1】:

.Net 插件架构不适用于 Nuget

正如你所说的,引用Microsoft.Data.Sqlitelib 插件 项目没有运行时文件夹,当exe 项目引用 lib plugins 项目,runtimes 文件夹将被复制到 exe 项目的输出文件夹中。

解决方案

1) 由于您不想为控制台项目引用 lib 插件 项目,因此您可以在 MsTestcopy task in msbuild /strong> 项目的运行时文件夹。

将此目标写入Net Core 3.1 控制台应用程序的xxx.csproj 文件中:

<Target Name="Copy_Runtimes" AfterTargets="Build">

        <ItemGroup>
            <CopyItems Include="..\MsTest\bin\Debug\xxx\runtimes\**\*.*" />
        </ItemGroup>

        <Copy SourceFiles="@(CopyItems)" DestinationFolder="$(OutputPath)runtimes\%(RecursiveDir)%(Filename)%(Extension)')"></Copy>
</Target>

2)除此之外,您还可以在net core 3.1控制台应用程序中安装名为sqlite的nuget包,该包只包含runtimes文件夹,不包含其他com dll供使用。

它实际上是一个提供runtimes文件夹的纯服务包。

您可以直接在您的控制台项目中安装这个包,如果您对此不满意,您只能尝试解决方案1来解决问题。

【讨论】:

我在这个答案中遇到了两个问题。首先是我需要额外的* glob 来获取所有*Connector 项目Include="..\*Connector\bin\Debug\xxx\runtimes\**\*.*"。那个额外的星号会阻止 %(RecursiveDir) 正常工作。第二个问题是,我发现在处理一般的 .Net Core 或特别是插件时,复制二进制文件是高度不可靠的。从那以后我知道我需要dotnet publish 来确保正确传输所有引用。

以上是关于.Net 插件架构不适用于 Nuget的主要内容,如果未能解决你的问题,请参考以下文章

TeamCity Nuget 安装构建步骤不适用于多个源,其中之一是 TC 的私有 NuGet 源

NuGet 自动包还原不适用于 MSBuild

JQuery 数据表不适用于 ASP.NET MVC 5

“文件太小,不适用于架构arm64”,“clang:错误:链接器命令失败,退出代码为1”

dotnet pack 不适用于 Azure Function(Pack Azure Functions for Nuget)

无限幻灯片插件不适用于背景图像