【发布时间】: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