【问题标题】:PInvoke c++ dll from c# - An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)PInvoke c++ dll from c# - 试图加载格式不正确的程序。 (来自 HRESULT 的异常:0x8007000B)
【发布时间】:2011-08-14 07:02:58
【问题描述】:

尝试使用 Dll Import 从 c# 访问旧的 c++ dll。 现在在网上搜索了大约 4 天,但没有成功。

我正在尝试使用来自 asp.net mvc 3 网站 .net 4 的 c++ dll。

我已将平台目标更改为 x86。 我已经在 iis 的应用程序池上将“启用 32 位应用程序”设置为 true。

在 iis 7.5 中使用 Windows Server 2008 R2

有什么方法可以调试或获取更多关于可能出错的信息吗?

链接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++ 方法调用的错误声明会导致此错误吗?读取错误可能会猜到调用具有 3 个参数的函数应该接收 4 会导致此错误。

【问题讨论】:

  • 更改设置后是否回收应用程序池?
  • 是的,甚至 net stop w3svc
  • 可能与this有关。

标签: c# .net iis pinvoke 32bit-64bit


【解决方案1】:

回答你最后一个问题:

在 c# 中错误地声明 C++ 方法调用会导致此错误吗?

不,我不相信它会 - C++ 方法的错误声明可能导致许多事情发生,从函数正确执行到抛出互操作异常,但我不相信这个异常将被抛出 - 这是特定于加载 dll 的问题。

您应该检查以确保尝试加载此 dll 的进程实际上是一个 32 位进程,方法是通过某种方式获取进程 ID(例如通过捕获和记录异常),然后检查在任务管理器中。如果进程实际上是 64 位进程,那么您可能配置错误。

您还应该检查以确保您尝试加载的 dll(及其所有依赖项)实际上是 32 位的 - 我相信如果您尝试将 64 位 dll 加载到一个 32 位进程。您应该可以使用 Dependency walker(一个非常有用的全方位工具)来检查这一点。

【讨论】:

  • 这太糟糕了。再次重启解决了我的麻烦。感谢您的所有帮助!
  • 您没有收到该错误是对的。我遇到了元帅异常
  • @Dashu Weird,也许一个程序集的旧缓存副本放在某个临时目录中 - 无论如何,很高兴听到您对其进行了排序。
猜你喜欢
  • 2016-05-09
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多