c# - .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 项目中有两个没有运行时文件夹:
- 该插件对 Microsoft.Data.Sqlite 有 Nuget 依赖项,但没有该
runtimes
文件夹,因为插件项目是 DLL ......不是可执行文件。 - 测试 Sqlite 插件的 MsTest 项目确实具有
runtimes
文件夹和内容,因为 (1) 它是一种可执行文件,并且 (2) 它具有对插件项目的项目引用(它又引用 Nuget 包)。 - 主控制台应用程序是一个可执行文件,但(故意)没有对插件的项目引用。因此它没有
runtimes
文件夹。
我该如何解决这个问题?作为 hack,我只是将丢失的 DLL 复制到控制台应用程序的输出目标目录中。
另外,如果我将控制台应用程序中的项目引用添加到插件中,这个问题就解决了。但是,如前所述,我不希望控制台应用程序具有对任何插件的项目引用。插件应该是动态发现的。我认为解决此问题可能与创建 nuspec 文件有关。但是,nuspec 文件的文档没有关于解决此问题的评论。
解决方案
.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来解决问题。
推荐阅读
- cmake - 致命错误:libusb/libusb.h:没有为 GNU 无线电安装这样的文件或目录 librtlsdr
- excel - 如何在 Excel 中使用 VBA 将某些行复制到不同工作表上的不同范围?
- python - 查找可删除素数时如何使用更少的内存?
- c - 将结构指针传递给函数不会对其进行编辑
- python - 为什么我没有使用 torch.save 获得输出?
- java - 如何在循环中添加有限的 3 次尝试?
- python - 是否可以删除用 Python 中的函数创建的画布对象?
- python - 在python中用NaN填充缺失的时间戳
- flask - Werkzeug 例程 BuildError:无法为端点“索引”构建 url。您的意思是“静态”吗?
- docker - 无法在 Windows 10 上安装桌面 docker