从C#调用C++ DLL的PInvoke-尝试加载一个格式不正确的程序。(来自HRESULT的异常:0x8007000B)

3
尝试使用 Dll Import 从 C# 访问旧的 C++ dll。已经在网络上搜索了大约 4 天,但没有成功。
我正在尝试从一个 asp.net mvc 3 网站 .net 4 中使用 C++ dll。
我已将平台目标更改为 x86。 我已在 IIS 应用程序池中将“启用 32 位应用程序”设置为 true。
使用 Windows Server 2008 R2 和 iis 7.5
是否有一些方法来调试这个问题或获取更多关于可能出错的信息?
链接 ASP.NET P/Invoke "An attempt was made to load a program with an incorrect format" 指出:
“要使用 32 位 dll,您的 Web 应用程序必须运行在 32 位模式下,这是通过将 IIS 切换到 32 位模式来完成的”,并提供了一个链接,介绍如何更改此设置,不过这似乎只涉及到 IIS 6 和 asp.net 2。
提前感谢! 最好的问候
编辑 1: C# 中 C++ 方法调用的声明错误会导致此错误吗?读取错误信息可以猜测调用一个应该接收 4 个参数的带有 3 个参数的函数会导致此错误。

更改设置后,您是否回收了应用程序池? - Ben Voigt
是的,甚至执行了 net stop w3svc。 - Dashu
可能与这个有关。 - jfs
1个回答

4

好的,回答您最后一个问题:

如果在C#中声明C++方法调用错误,会导致这个错误吗?

不会,我认为不会- C++方法的错误声明可能会导致许多事情发生,从函数正确执行到抛出Interop异常,但我不认为会抛出此异常-这是特定于加载dll的问题。

您应该检查尝试加载此dll的进程是否实际上是32位进程,例如通过捕获和记录异常来获取进程ID,然后在任务管理器中进行检查。如果进程实际上是64位进程,则可能配置了某些不正确的内容。

您还应检查要加载的dll(及其所有依赖项)是否实际上是32位-dll。如果尝试将64位dll加载到32位进程中,则可能会遇到类似的问题。您可以使用Dependency Walker(一个非常有用的工具)来检查此问题。


这真糟糕。再一次重启解决了我的问题。感谢你们的帮助! - Dashu
你说得对,我没有收到那个错误。我遇到了一个marshal异常。 - Dashu
@Dashu 可能是某个临时目录中存在一个旧的缓存副本程序 - 不管怎样,很高兴听到你已经解决了这个问题。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接