好的,这个问题更多的是关于理解问题是什么,因为我不认为任何人都能告诉我如何解决问题。
我正在写一个.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。如果有人能够再解释一下这个问题会有什么帮助呢?
如果您需要更多信息,请与我们联系。
答案 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。在这种情况下,没有其他解决方案对我有用。