C# 如何使用使用不同 CPU 架构的库?

Posted

技术标签:

【中文标题】C# 如何使用使用不同 CPU 架构的库?【英文标题】:C# How can I use libraries which use a different CPU architecture? 【发布时间】:2019-09-18 21:01:10 【问题描述】:

我目前正在使用 C# 开发一个独立的应用程序,但我遇到了一个我找不到解决方案的问题。实际上,我的脚本使用了两个库(由外部公司提供),但是,一个用于 64 位系统,另一个用于 32 位系统。所以这是我的问题,一旦我尝试同时使用这两个库,我总是会得到一个错误:

System.BadImageFormatException

我已经尝试为“Any CPU”、“x64”和“x86”构建我的项目,但我总是遇到同样的问题。

所以我想知道是否有可能解决这个问题以便能够在同一个脚本中使用这两个库,或者是否有其他技术可以达到相同的结果?

提前谢谢你, 克莱门特

【问题讨论】:

您必须为这两个进程启动不同的进程并将各自的程序集加载到每个进程中,然后找出两者之间的通信。 无法将 32 位和 64 位程序集加载到同一进程中。 另一种方法是联系供应商,看看是否有办法让他们提供所有这些程序集的 32 位或 64 位版本,这样您就不会必须跳过箍来加载它们。 不幸的是,提供这些库的公司最近关闭了......如果我开始在 A 脚本(64 位)中处理第一个库,然后使用 B 脚本(86 位),结果可能是决定性的? 可能,尝试通过 TCP 实现客户端-服务器的 DLL-as-a-service 方法。服务器为您的库运行 32 位包装器,您向他询问操作。手动、gRPC、SignalR、WCF 等 可能,重复:***.com/questions/26598558/… 【参考方案1】:

如果 libraries 使用第三方标准 windows dlls,这将更加困难。

但是,只需反编译该库,然后重建它在您选择的bitness中。


注意 1:注意这可能会侵犯许可协议

注意 2 :一些反编译器可能会有点失败

【讨论】:

如果你无权访问源代码,必须反编译,你很可能违反了许可协议。 @TsahiAsher 鉴于 OP 说供应商公司最近关闭,这有关系吗? @NetMage IANAL,但一家关闭的公司并不意味着它的所有版权都无效。例如,它可能已出售其专利以偿还债务。 @TsahiAsher 没错,但你说的是许可协议。我想这取决于它是停业还是被购买或出售,以及在这些情况下协议的内容。但如果它倒闭了,谁来执行这些条款? @NetMage 公平点。不过,这很可能侵犯了版权。

以上是关于C# 如何使用使用不同 CPU 架构的库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中获取 CPU 使用率?

如何正确调整从 C# 中的库生成的条形码大小

如何在 C#(托管代码)中获取 *THREAD* 的 CPU 使用率和/或 RAM 使用率?

如何强制 Scala 使用不同的库版本?

如何调试 Gradle 为啥使用我在依赖子项目中指定的不同版本的库?

如何记录我的控制台应用程序的 CPU/网络使用情况,替代 c# 中的单元测试