我在这里变得很绝望。我的项目因使 System.IO.Ports 在 Windows 上的此 .NET 5.0 解决方案中工作的问题而停滞。我最近将整个应用程序从 VS2017/.NET Framework 4.6.1/WinForms 移植到 VS2019/.NET5/WPF。我在大手术之前没有这个问题。
如果我使用 WPF 应用程序和使用 System.IO.Ports 的类库创建一个新的基本解决方案,它可以完美地工作。
与实际解决方案的不同之处在于:
显示错误的第一件事是构建后输出文件夹中没有 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
最好是我创建一个新问题,但这是我发现的最新更新。
System.IO.Ports 正在被我的库 StepBro.Streams 使用。 StepBro.Streams 由 WPF 应用程序使用的 StepBro.Core 动态加载。
当 StepBro.Core(通过 Newtonsoft.Json)创建 StepBro.Streams 中的一种类型的实例时,我收到上述错误。
我不再卡住了,因为我暂时从 StepBro.Core 添加了对 System.IO.Ports 的引用。这样,在使用反射从 StepBro.Streams(或 System.IO.Ports)创建类型时,程序集已经加载。
所以,有一个问题,动态加载程序集时 ,并且在我进行了所有重新安装和不同的实验之后,我不知道该怎么办。
也许这是我的 VS2019 解决方案的问题,我安装的 .NET5 或者确实是 .NET5 中的错误。
最佳答案
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
组装和失败。我不知道关于不需要程序集二进制文件存在的评论中的所有废话是什么,但加载程序不同意你们两个。System.IO.Ports is being used by my library StepBro.Streams
那你把你的库打包错了。您希望导出依赖项,以便宿主项目继承它。
一旦完成,唯一剩下的问题是,因为您实际上从未直接使用端口程序集公开的类型,编译器不知道您实际使用了该库,因此它将从生成的二进制文件中省略它。您至少希望在某个时候引用该程序集中的某些内容,甚至是简单的
typeof(SerialPort)
.
关于c# - System.IO.Ports 5.0 NuGet 包在我的解决方案中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66107078/