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)
答案 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位。