【问题标题】:An attempt was made to load a program with an incorrect format试图加载格式不正确的程序
【发布时间】:2014-06-27 19:03:27
【问题描述】:

我正在使用 C# 加载 C++ dll,并收到此错误:

“MyApp.exe 中发生了“System.BadImageFormatException”类型的未处理异常” “附加信息:尝试加载格式不正确的程序。(HRESULT 异常:0x8057000B)

我不知道为什么。 C++ dll 是使用 vs2012 向导、win32 应用程序、带预头的 dll 生成的。它是用 x64 选项构建的。代码如下:

// MyNativeDLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
    //char* pMemoryBuffer = NULL;
    using namespace std;

    __declspec(dllexport) long  Test()
    {
        long a;
         a = 1;
         a++;
         return a;
    }

调用它的 C# 代码是:

[DllImport("C:\\MyNativeDLL\\x64\\Debug\\MyNativeDLL.dll",  EntryPoint = "Test")]
private extern static int Test();
void doJob()
{
   long a = Test();  // exception thrown here
}

C# 代码是使用 Any CPU 选项构建的,它正在加载 x64 本机 dll。 我想知道我哪里做错了?我已经尝试了很长时间,但真的被困在这里。谢谢!

更新 当我使用 win 32 选项编译我的本机 dll 并设置正确的 dll 路径时,它会成功加载。但是,当我使用 x64 选项编译我的本机 dll,使用正确的路径加载时,加载失败。

【问题讨论】:

  • 检查进程是32位,而dll是64位,还是vs verse
  • 为什么返回类型保留int?如果将 C# 应用程序的目标平台设置为 x64 会发生什么?
  • 看来我的应用程序是 32,因为它在 Windows 进程监视器中有一个 32*。但是我使用 C# 创建应用程序,那么如何将其更改为 x64?
  • @HassanNisar 它抛出同样的错误。
  • @Ono,可能不相关,但你能告诉我为什么使用private extern static int Test();而不是private extern static long Test();吗?

标签: c# c++ visual-studio-2012 dll dllimport


【解决方案1】:

正如你所说: C++ dll 是使用 vs2012 向导、win32 应用程序、带有 pre-head 的 dll 生成的。它是用 x64 选项构建的

DLL 和 exe 必须都是 32 位的,或者都是 64 位的。

【讨论】:

  • 我该如何做到这一点?我想为 C#,只用任何 CPU 构建?但这给出了我在线程中提到的错误。
猜你喜欢
  • 2014-01-11
  • 2016-05-17
  • 2012-05-01
  • 2014-02-10
  • 2015-10-13
  • 1970-01-01
  • 2012-11-02
  • 2019-01-14
  • 1970-01-01
相关资源
最近更新 更多