尝试在 C# 中加载程序集时出错

问题描述 投票:0回答:3

好吧,这个问题更多的是关于理解问题是什么,因为我认为没有人能够告诉我如何解决问题。

我正在编写一个 .net 4 应用程序,并且我有一个想要引用的第 3 方 dll(hasp dongle 保护)。

Visual Studio 允许我创建引用并在代码中使用 dll 中包含的类。

第一个问题发生在程序运行并且dll实际加载时。然后我收到以下错误。

System.BadImageFormatException:无法加载文件或程序集 “hasp_net_windows.dll”或其依赖项之一。不是有效的 Win32 应用程序

网络链接说明了如何修复此错误。有人可以解释一下问题是什么以及为什么我会遇到这个问题吗?

遵循此建议后,我将主项目构建设置为 x86,然后出现另一个错误,替换另一个错误。新的错误是:

System.IO.FileLoadException:混合模式程序集是针对 运行时版本“v1.1.4322”,无法在 4.0 中加载 无需额外配置信息的运行时

这个 weblink 说明了如何修复错误,但我的项目中没有 app.config,并且希望尽可能避免使用。如果有人可以再次解释问题是什么,那会有帮助吗?

如果您需要更多信息,请告诉我。

c# .net dll
3个回答
9
投票

问题在于您的应用程序的“位数”。一旦选择(32 位或 64 位),该进程中的所有 DLL 都需要相同。这个异常告诉我你的一个 DLL 的“位数”是错误的。 您根本不能在给定进程中拥有具有不同编译目标的 DLL,进程具有“位”亲和力。 如果这是第三方非托管 DLL,那么它很可能是 32 位编译的。

将根项目(创建 exe 的项目)的构建输出设置为 x86 就足够了,因为这将决定创建的进程。任何其他 .NET 项目都可以是任何 CPU,并且适合 32 位或 64 位运行时。

不幸的是,对于您的第二个问题,提供的链接是解决它的方法。在项目中拥有 app.config 并没有什么问题,而且你还没有说明为什么不需要它。

尽管 Adam Houldsworth 给出了答案,但我想补充一点,无需 app.config 就可以做到这一点。然而,这需要更多的工作,并且可能需要正确理解 COM 互操作。当然,是否值得麻烦取决于您;)。


3
投票

useLegacyV2RuntimeActivationPolicy 方法以编程方式设置

ICLRRuntimeInfo::BindAsLegacyV2Runtime

有关如何执行此操作的快速概述已发布在此博文中
。不过请注意他的警告,这可能会让您在使用这种方法时三思而后行:

这种方法有效,但我会非常犹豫是否在公共场合使用它 面对生产代码,特别是对于除 初始化您自己的应用程序。虽然这应该适用于 库,使用它有一个非常讨厌的副作用:你改变了运行时 执行应用程序的策略以一种非常隐藏和 不明显。

我无法使用 app.config 文件,因为程序集是通过 COM 从本机程序加载的。 我找到了支持.net Framework 4.0的库。 这里

。在这种情况下,没有其他解决方案对我有用。

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.