【问题标题】:System.IO.Ports 5.0 NuGet package does not work in my solutionSystem.IO.Ports 5.0 NuGet 包在我的解决方案中不起作用
【发布时间】:2021-02-08 18:12:44
【问题描述】:

我在这里变得非常绝望。我的项目因让 System.IO.Ports 在 Windows 上的这个 .NET 5.0 解决方案中工作而停滞不前。我最近将整个应用程序从 VS2017/.NET Framework 4.6.1/WinForms 移植到 VS2019/.NET5/WPF。大手术之前我没有这个问题。

如果我使用 WPF 应用程序和使用 System.IO.Ports 的类库创建一个新的基本解决方案,它可以完美运行。

与真正解决方案的区别是:

  • 真正的解决方案是使用其他 NuGet 包:Antlr4.Runtime.Standard 4.9.1、Antlr4BuildTasks 8.13、CommandLineParser 2.8、Newtonsoft.Json 12.0.3、System.Reflection.Emit 4.7 和 System.Resources.Extensions 5.0.0。
  • 正在使用反射动态加载使用 System.IO.Ports 的类库。
  • WPF 应用程序正在使用 ActiproSoftware.Controls.WPF 20.1.1

首先显示出问题的是构建后输出文件夹中没有 System.IO.Ports.dll 的副本。我尝试将控制台应用程序添加到解决方案(也是 .NET Core 3.1,然后更改为 .NET5),System.IO.Ports.dll IS 的副本被复制到输出文件夹。 但裸机测试解决方案确实将 System.IO.Ports.dll 按预期复制到其输出文件夹,因为它是一个依赖于 System.IO.Ports 的类库。 即使我在解决方案中添加了一个新的类库而不添加对其依赖项的任何项目引用,也不会复制 System.IO.Ports.dll。

我在解决方案资源管理器的项目中使用“管理 NuGet 包...”将 System.IO.Ports 5.0.0 包添加到项目中。

我希望我可以对解决方案进行某种重置或清理以修复它,但我不知道该怎么做。 现在我只需要它在 Windows 上工作。

我还可以尝试重新从头开始创建整个应用程序并开始添加源文件和依赖项,直到问题再次出现。 但现在我希望得到一些帮助:-)

在某处的解决方案/项目设置/配置中很可能是一件微不足道的事情。我在 .net 开发的那部分并不擅长。

我不确定这是否与我的问题有关,但我不确定 .NET 5 SDK 是否 100% 正确安装,因为我没有 .NET5 项目模板(而且我没有'不知道我是否应该有)。我创建“.NET Core”类型的项目,并在创建后将目标框架更改为 .NET 5.0。我做了一个完整的重新安装,它是一样的。其他一切似乎都有效...

干杯, 一月

更新

我可能误以为 System.IO.Ports.dll 应该被复制到输出文件夹中,从而使事情变得混乱。我知道它不应该。

我在构建时没有遇到任何问题。一切都在那里工作。 我在运行时遇到的错误以及我开始试验的原因是:

System.IO.FileNotFoundException
  HResult=0x80070002
  Message=Could not load file or assembly 'System.IO.Ports, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
  Source=System.Private.CoreLib
  StackTrace:
   at System.Signature.GetSignature(Void* pCorSig, Int32 cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
   at System.Reflection.RuntimeMethodInfo.get_Signature()
   at System.Reflection.RuntimeMethodInfo.FetchNonReturnParameters()
   at System.Reflection.RuntimeMethodInfo.GetParameters()
   at Newtonsoft.Json.Serialization.DefaultContractResolver.GetCallbackMethodsForType(Type type, List`1& onSerializing, List`1& onSerialized, List`1& onDeserializing, List`1& onDeserialized, List`1& onError)
   at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveCallbackMethods(JsonContract contract, Type t)
   at Newtonsoft.Json.Serialization.DefaultContractResolver.InitializeContract(JsonContract contract)
   at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType)
   at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Newtonsoft.Json.Utilities.ThreadSafeStore`2.Get(TKey key)
   at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type)
   at StepBro.Core.Parser.StepBroListener.CreateVariableContainerObjectInitAction(Type objectType, PropertyBlock properties, ErrorCollector errors, IToken startToken) in C:\SW_development\Private\StepBro\source\StepBro.Core\Parser\StepBroListener.cs:line 277

我现在尝试重新安装 .NET5 运行时,但得到了同样的错误。我应该也卸载 SDK 还是应该只安装其中一个? 我可以在应用程序和功能中看到两个 SDK 安装:MS .NET SDK 5.0.102 (x64) 和一个带有“来自 Visual Studio”的后缀。

更新 #2

我最好创建一个新问题,但这里是我发现的最新更新。

我的库 StepBro.Streams 正在使用 System.IO.Ports。 StepBro.Streams 由 WPF 应用程序使用的 StepBro.Core 动态加载。 当 StepBro.Streams 中的一种类型的实例由 StepBro.Core(通过 Newtonsoft.Json)创建时,我收到上述错误。

我不再卡住了,因为我暂时从 StepBro.Core 添加了对 System.IO.Ports 的引用。这样,当反射用于从 StepBro.Streams(或 System.IO.Ports)创建类型时,程序集就已经加载了。

所以,有一个问题,动态加载程序集时,在我完成了所有重新安装和不同的实验之后,我不知道该怎么办。 也许这是我的 VS2019 解决方案的问题,我安装的 .NET5 或者确实是 .NET5 中的错误。

【问题讨论】:

  • 构建文件夹中不应有 System.IO.Ports 的副本。它应该是网络库的一部分。看起来有人用旧版本的代码创建了一个 kludge 来让旧代码工作。请参阅以下内容:nuget.org/packages/System.IO.Ports
  • 谢谢,@jdweng。我不确定我是否会更明智地阅读该页面。
  • 我会下载最新版本,然后确保您进行干净的构建。然后使用以下命令安装:docs.microsoft.com/en-us/dotnet/core/install
  • 我忘了说的是我没有得到任何编译错误但在运行时我得到一个异常: System.IO.FileNotFoundException: 'Could not load file or assembly 'System.IO.Ports , Version=5.0.0.0 我想这是真正的问题......我会尝试重新安装.NET5。
  • Net 库没有在 bin 文件夹中查找 dll。正如我所说,有人试图通过将 dll 放入 bin 文件夹来解决问题,但它没有用。

标签: c# .net wpf visual-studio-2019 .net-5


【解决方案1】:

Could not load file or assembly 'System.IO.Ports, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.

反射加载器正在尝试加载System.IO.Ports.dll 程序集并失败。我不知道 cmets 中关于不需要程序集二进制文件存在的所有废话是什么,但加载程序不同意你们俩。

System.IO.Ports 正在被我的库 StepBro.Streams 使用

然后你错误地打包了你的库。您希望导出依赖项,以便宿主项目继承它。

一旦完成,唯一剩下的问题是,因为你从不直接使用 ports 程序集公开的类型,编译器不知道你实际使用了这个库,所以它会从生成的二进制文件。您至少想在某个时候引用该程序集中的某些内容,甚至是简单的typeof(SerialPort)

【讨论】:

  • 既然你花时间写了一个答案,我会礼貌地评论它。我拥有从 .Net2 到 .Net4.6 的所有经验,并且自 2006 年以来开发了一个相当大的应用程序。在该应用程序以及我的新应用程序的 .Net4.6 版本中,这一直有效。动态加载的程序集(插件)公开它们需要的任何接口,并根据需要使用它们自己的依赖项。关于 .Net Core 以及打包和部署,我有很多不知道的地方,但在我看来,问题是迁移到 .Net5 时出现的,希望有好心人能帮助我。
  • 如果没有我们可以运行和调试的实际最小可重现项目,您将不会得到比这更多的帮助。我建议在 .Net5 存储库上发布,但他们只会关闭您的问题而无需复制(这是理所当然的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多