我希望这个问题不会被视为重复,因为我知道stackoverflow上有许多类似的问题。我应该知道。我已经阅读了大部分内容。所以忍受我...
我正在编写一个依赖OpenCV库来运行的C#应用程序。 OpenCV库是用c ++代码编写的,为了在c#中使用它,我编写了2个库:一个静态库,包含我想要的OpenCV方法;一个CLR DLL,它充当静态lib和C#项目之间的桥梁。
让我感到困惑的是,在我因病毒重新安装Windows 8.1之前一切正常。在重新安装之前,应用程序编译并按预期运行。重新安装后,同一个项目在尝试调试时抛出“BadImageFormatException”:
namespace G19_GUI
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new GUI.GUI()); //this is the line producing the exception
}
}
}
Additional information: Could not load file or assembly 'clrLib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
我知道这个异常的最常见原因是应用程序试图将32位库加载到64位编译应用程序中,反之亦然。因此,我验证了我尝试使用的OpenCV库注定要在32位应用程序中使用,事实上它们确实如此。我尝试切换到64位dll,动作产生了39个“LINK2028:未解析的令牌”类型的错误。
请记住,在2个Windows安装之间,项目本身并没有发生任何变化。我使用了相同的属性表和相同的OpenCV库。一切都保存在一个外部驱动器上,当我愚蠢地双击病毒可执行文件时被拔掉,并在DropBox上备份,重新安装Windows后我唯一需要做的就是重置路径和OpenCV环境变量,我使用.bat文件,相同的.bat文件用于在第一次安装Windows时设置那些非常相同的变量。因此,我高度怀疑病毒可能会弄乱我的项目文件。即便如此,我还是仔细检查了一切,发现没有任何错误。
我继续在线记录例外情况。结果,我最终尝试了配置构建和目标平台的所有可能组合,我敢于耐心地尝试我在解决方案中拥有的所有3个项目。
实际上,尝试为64位计算机构建和编译删除了异常,但我的C#项目所依赖的另一个DLL的目的是32位使用,当尝试加载该DLL时,弹出了同样的异常(这是预期的)。不幸的是,DLL没有附带32位版本或源代码来尝试构建我自己的64位版本的DLL。
因此,我被迫为两个目标平台(任何cpu,混合平台,无论如何)或仅为32位构建我的应用程序。当然,这在启动时会产生异常。
我知道我的所有DLL都是为32位使用而制作的。对于我的生活,我无法弄清楚问题是什么,也不知道为什么在重新安装操作系统之前这个问题不存在。
以下是我的clrLib dll的代码:
#include "Stdafx.h"
#include "clrLib.h"
#include <vector>
namespace clrLib
{
public ref class mapper
{
private:
static openCVProc * myProc;
public:
static mapper(void)
{
myProc = new openCVProc();
}
char * mapStringToChar(String ^ path)
{
return (char*)(void*)Marshal::StringToHGlobalAnsi(path);
}
array<int>^ getRGBfromHSV(int h, int s, int v)
{
array<int>^ values = gcnew array<int>(3);
std::vector<int> myVals = myProc->hsv2rgb(h, s, v);
values[0] = myVals[0];
values[1] = myVals[1];
values[2] = myVals[2];
return values;
}
array<int>^ getHSV(String^ src)
{
array<int>^ vals = gcnew array<int>(3);
vals[0] = (myProc->getHSV(mapper::mapStringToChar(src)))[0];
vals[1] = (myProc->getHSV(mapper::mapStringToChar(src)))[1];
vals[2] = (myProc->getHSV(mapper::mapStringToChar(src)))[2];
return vals;
}
void openCam()
{
myProc->startCam();
}
void closeCam()
{
myProc->stopCam();
}
int^ getBrightness()
{
int^ b;
b = myProc->getB();
return b;
}
bool^ camState()
{
return myProc->camState();
}
array<Byte>^ mapper::getFrameData()
{
cv::Mat f = myProc->getFrame();
int width = f.cols;
int height = f.rows;
array<Byte>^ bitmapData = gcnew array<Byte>(width*height * 3);
int c = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
bitmapData[c] = f.at<cv::Vec3b>(i, j)[0];
bitmapData[c + 1] = f.at<cv::Vec3b>(i, j)[1];
bitmapData[c + 2] = f.at<cv::Vec3b>(i, j)[2];
c += 3;
}
}
return bitmapData;
}
Size^ mapper::getFrameSize()
{
std::vector<int> size = myProc->getFrameSize();
Size^ frameSize = gcnew Size(size[0], size[1]);
return frameSize;
}
};
}
其他2个库有点冗长,但如果需要,我会包含它们。
感谢您抽出宝贵时间阅读我的帖子。