重新安装Windows 8.1后尝试运行应用程序时出现BadImgeFormatException

时间:2015-05-18 10:08:51

标签: c# c++ dll clr

我希望这个问题不会被视为重复,因为我知道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个库有点冗长,但如果需要,我会包含它们。

感谢您抽出宝贵时间阅读我的帖子。

0 个答案:

没有答案