C#应用程序加载C ++ DLL异常

时间:2014-02-09 01:14:39

标签: c# c++ dllimport

C#应用程序加载C ++ dll:

得到了这个例外:

尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)

异常发生在

CartToPol(fileName, _imageWidth, _imageHeight, _bytePerPixle);

在下面的C#代码中(大约在中间,向下滚动一点,你可以看到该行)

C#代码:

using System;
// many usings here omitted .......   

namespace CarPoolUI
{
    public partial class MainWindow : Window
    {
        private int _imageWidth;
        private int _imageHeight;
        private int _bytePerPixle;
        private IntPtr _imageData;

        public MainWindow()
        {
            InitializeComponent();                  
        }

        [DllImport("D:\\Projects\\CarPool\\x64\\Debug\\CarPool.dll", EntryPoint = "CartToPol")]
        public static extern long CartToPol(string fileName, int imgWidth, int imgHeight, int bytePerPixel);


        public void ProcessData(bool doColor, string fileName)
        {
            try
            {
               string fileName = "D:\\myData\\data.dat";
            _imageWidth = 512;
            _imageHeight = 512;
            _bytePerPixle = 2;
                 **// this is where exceptions happen!!**
                CartToPol(fileName, _imageWidth, _imageHeight, _bytePerPixle);

            }
            catch(Exception ex)
            {
               string err = ex.ToString();
            }

        }

    }
}

C ++(CPP)代码:

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

#include "stdafx.h"
#include "CarPool.h"

using namespace std;

namespace CarPool
{

    long CarPool::CartToPol(string fileName, long imgWidth, long imgHeight, long bytePerPixel)
    {
        long ret = 0;

       return ret;
    }

    long PolToCart(string fileName, long imgWidth, long imgHeight, long bytePerPixel)
    {
        long ret = 0;

       return ret;

    }    
}

C ++(.h)代码

#include <string>


namespace CarPool
{
    // This class is exported from the CarPool.dll
    class CarPool
    {
    public: 
        // cartesian to polar
        long CartToPol(std::string fileName, long imgWidth, long imgHeight, long bytePerPixel);

  //polar to cartesian
        long PolToCart(std::string fileName, long imgWidth, long imgHeight, long bytePerPixel);


        //polar to cartesian
        static int* LoadData(std::string fileName, long imgWidth, long imgHeight, long bytePerPixel);
    };

}

尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)

2 个答案:

答案 0 :(得分:2)

尝试加载具有错误格式错误的程序通常意味着您尝试从64位代码或vise-vera加载32位DLL。

您的C ++项目似乎构建为64位代码(因为您的DLL路径包含一个X64)。这可能意味着您的C#应用​​程序以32位模式运行。这很可能也是因为Visual Studio 2010客户端应用程序项目(控制台,WinForms,WPF)默认为32位目标。

双击解决方案资源管理器中的“属性”项,检查C#应用程序的项目设置。然后选择“构建”部分并确保平台目标是“x64”。如果它是“x86”,那意味着你的C#代码在32但是模式下运行。

在IIS中设置Enable 32-Bit Applications设置不正确有两个原因。首先,您希望C#代码以64位模式运行,启用该设置将强制代码以32位模式运行。其次,该设置仅影响在IIS中运行的应用程序(读取ASP.Net)而非客户端应用程序。

答案 1 :(得分:2)

鉴于这一行:

[DllImport("D:\\Projects\\CarPool\\x64\\Debug\\CarPool.dll", EntryPoint = "CartToPol")]

您正在.net程序中构建一个用于p / invoke的64位DLL。

我的精神力量建议您的.NET应用程序正在编译为32位。将DLL和App编译为64位,或者将它们编译为32位。