.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.Sqlite
的lib 插件 项目没有运行时文件夹,当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 源
“文件太小,不适用于架构arm64”,“clang:错误:链接器命令失败,退出代码为1”
dotnet pack 不适用于 Azure Function(Pack Azure Functions for Nuget)