我在64位系统上调用32位非托管DLL的函数.我得到的是:
BadImageFormatException:尝试加载格式不正确的程序.(HRESULT异常:0x8007000B)
起初,我将我的项目设置为Any CPU平台,因此我将它们都更改为x86,但此错误仍在发生.这真的是我所知道的唯一解决方案.
DLL没有损坏或任何东西,因为我可以将它们与其他程序一起使用(我没有源代码).我想也许它没有找到依赖,但我检查了,他们都在那里.另外,DllNotFoundException在这种情况下不会抛出一个吗?
我还可以做些什么?在您说"使用64位非托管DLL"之前,让我指出没有一个.;)
我有一个ASPX网页,可以执行一些复杂的操作和数据库调用.当我通过运行ASP.NET Development Server(Cassini)查看网页时,大约需要200ms.
然后,在没有任何代码更改和配置更改的情况下,我将网站部署到我的本地计算机IIS 7并再次查看同一网页.它需要2.0秒,慢10倍.
我认为IIS应该比卡西尼快(或者至少快).
为了进一步调查,我创建了一个新页面test1.aspx,它只包含一个空的for循环,在Page_Load中运行了9000万次.在卡西尼号,它需要大约200毫秒.在IIS中,它需要300毫秒(慢50%).
可能是什么原因导致IIS比卡西尼慢?或者,也许是一个更好的问题,我怎样才能使IIS运行至少与卡西尼一样快?
我有一个 32 位和 64 位版本 (x86) 的本机 DLL。我想创建一个适用于两种架构(任何 CPU)的包装器,并根据当前环境(32 位或 64 位,运行时!)加载正确版本的 DLL。这个过程应该自动发生,所以我的 DLL 的用户不需要针对特定的体系结构。
有没有关于如何做到这一点的最佳实践?任何可以指导我的例子?
我找到了一种可能的解决方案,它为每个架构使用托管代理,然后使用该Assembly.Resolve事件加载正确的版本。但是,这要求我除了 2 个非托管库之外还有 3 个托管程序集,这似乎有点过头了。
还有其他解决方案吗?