首页 > 解决方案 > .Net 插件架构不适用于 Nuget

问题描述

我有一个加载插件的 .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 项目。它没有同样的问题。显然,runtimes如果 Visual Studio 项目 (1) 是某种可执行文件并且 (2) 具有相关的 Nuget 或项目引用,则文件夹和内容将自动存在。

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

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

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

标签: c#visual-studio.net-corepluginsnuget

解决方案


.Net 插件架构不适用于 Nuget

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

解决方案

1) 由于您不想为控制台项目引用lib 插件项目,因此您可以从MsTest项目的运行时文件夹中的 msbuild 中执行复制任务。

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

<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)此外,您还可以在控制台应用程序中安装名为sqlitenet core 3.1的nuget包,该包仅包含runtimes文件夹,不包含其他com dll供使用。

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

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


推荐阅读