c# - 在 .Net 5 项目中引用兼容的 .Net 框架 dll,但出现异常
问题描述
我正在将 .Net 框架项目移植到 .Net 5。该项目使用了一个外部库,该库似乎是针对 .Net Framework 2 编译的(我在 dotPeek 的参考资料中看到了 mscorlib 2.0)。我没有这个 dll 的来源,不可能从头开始重写它。
我在这里看到 .Net 核心提供了一些兼容性垫片,如果 api 被覆盖,它可能会正常加载。
我已经在 .Net Portability Analyzer 中加载了程序集,它给了我这些结果
.NET,版本=v5.0 | .NET 核心,版本=v3.1 | .NET 标准 + 平台扩展,版本=v2.0 | .NET 标准,版本=v2.1 |
---|---|---|---|
100 | 100 | 62.5 | 100 |
在详细信息部分,我可以看到 .Net 标准 2.0 缺少的目标成员,并且其他平台都支持所有内容。
目标会员 | .NET,版本=v5.0 | .NET 核心,版本=v3.1 | .NET 标准 + 平台扩展,版本=v2.0 | .NET 标准,版本=v2.1 | 建议的更改 |
---|---|---|---|---|---|
T:System.Runtime.InteropServices.TypeLibTypeAttribute | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ | |
M:System.Runtime.InteropServices.TypeLibTypeAttribute.#ctor(System.Int16) | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ | |
T:System.Runtime.InteropServices.ImportedFromTypeLibAttribute | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ | 删除使用。 |
M:System.Runtime.InteropServices.ImportedFromTypeLibAttribute.#ctor(System.String) | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ | 删除使用。 |
T:System.Runtime.InteropServices.TypeLibVersionAttribute | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ | |
M:System.Runtime.InteropServices.TypeLibVersionAttribute.#ctor(System.Int32,System.Int32) | 支持:5.0+ | 支持:2.0+ | 不支持 | 支持:2.1+ |
如果我正确解释这一点,我的 dll 应该在我的 .Net 5 项目中运行良好。我已将我的 dll 复制到项目目录中,将其设置为复制到输出目录并将其添加到引用中。
现在当代码运行时,我得到一个异常:
Retrieving the COM class factory for component with CLSID {51A3A6E0-1414-11D7-BD2E-08004608C318} failed due to the following error: 80040154 Classe non enregistrée (0x80040154 (REGDB_E_CLASSNOTREG)).
经过更多搜索后,我将目标平台设置为 x86 而不是 Any CPU,但异常仍然存在。
你有什么想法来完成这项工作吗?
解决方案
所以Hans Passant是对的(干杯),这是一个互操作程序集,问题在于相关的 COM 组件。
正确注册 COM 组件后,互操作程序集在 .Net Framework 项目和 .Net Core 项目中开始正常工作,因此兼容性垫片正确启动,api 调用从 .Net Core 中继到互操作程序集和 COM 组件。
兼容性一直下降,我有点吃惊,但这是个好消息。
推荐阅读
- gradle - Gradle JAXB WSDL 任务失败并出现 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContext
- mysql - 如何计算sqlite或mysql中两个日期之间的天数?
- java - Hamcrest:比较两个自定义类对象集合
- python - Pandas:将事件数据汇总到表格中
- javascript - 在 React-Redux 中加载存储
- testing - 持续改进:是否可以提前指定测试?
- angular - Angular6 表单验证
- ruby-on-rails - 如何在 AWS CodeBuild 上运行 docker-compose?
- python - Scrapy on Linkedin 已爬取 0 页
- javascript - Office.context.mailbox.displayNewMessageForm 在移动设备中不起作用