尝试在C#中加载程序集的错误

时间:2012-03-06 09:35:49

标签: c# .net dll

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

我正在写一个.net 4应用程序,我有一个第三方dll(hasp加密狗保护),我想参考。

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

运行程序并实际加载dll时会出现第一个问题。然后我得到以下错误。

  

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

weblink 说明了如何解决此错误。 Coud有人透露了问题是什么,为什么我得到它。

在遵循这个建议后,我将主项目构建设置为x86,然后我得到另一个错误替换另一个。新错误是:

  

System.IO.FileLoadException:构建混合模式程序集   版本'v1.1.4322'的运行时并不能在4.0中加载   运行时没有其他配置信息

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

如果您需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:9)

问题在于您的应用程序的“位置”。一旦选择(32位或64位)该进程中的所有 DLL 需要相同。这个例外告诉我你的一个DLL是错误的“位”。

在给定进程中,您根本无法拥有具有不同编译目标的DLL,进程具有“位数”亲和力。

如果这是第三方非托管DLL,则很可能是32位编译。

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

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

答案 1 :(得分:3)

尽管Adam Houldsworth给出了答案,但我想补充一点, 可以在没有app.config的情况下完成。但是,这需要更多的工作,并且可能正确理解COM互操作。是否值得麻烦当然取决于你;)。

您可以使用ICLRRuntimeInfo::BindAsLegacyV2Runtime方法以编程方式设置useLegacyV2RuntimeActivationPolicy

快速了解如何执行此操作is posted in this blogpost。请注意他的警告,这可能会让你在使用这种方法时三思而后行:

  

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

答案 2 :(得分:0)

我无法使用app.config文件,因为程序集是通过COM从本机程序加载的。 我找到了支持.net framework 4.0的库。 here。在这种情况下,没有其他解决方案对我有用。