混合的本机和托管代码堆损坏

时间:2012-01-11 12:24:11

标签: dllimport heap-corruption

我正在使用Visual Studio 2010并将本机C ++ DLL导入C#。当我只是从DLL中调用函数而在我的C#代码中什么都不做时,一切都按原样运行,但是当我开始在前端做其他事情时,我得到错误:

  

托管调试助手'FatalExecutionEngineError'在'D:\ Jeff \ 4YP \ ImageViewerApp \ ImageViewerApp \ bin \ Debug \ ImageViewerApp.vshost.exe'中检测到问题。   附加信息:运行时遇到致命错误。错误的地址是0x6b4f8127,在线程0x1460上。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。

我认为这是一个堆腐败问题。我试过玩DLL中的代码(基本上是导出一个类),并设法在删除分配给(非指针)类变量的所有行时运行程序。但指针和局部函数变量似乎不会导致腐败。而且奇怪的是,对于int,float,double类型的类变量的特定情况似乎没有损坏,但它确实发生在我的用户定义类型和bool(我没有尝试过所有类型)。

什么可能导致这种相当令人困惑的情况?

以下是我的C ++ DLL中的代码:

#pragma once

#include "stdafx.h"
#include "GlobalClassifier.h"

const int frameRate = 33;
const int jointFeaturesCount = 9;

namespace MyKinectDll
{
    typedef struct vector
    {
        public:
            float x;
            float y;
            float z;
    } VECTOR;

    [event_receiver(native)]
    class __declspec(dllexport) MyKinect
    {
        public:
            MyKinect(void)
            {
                //Fails when these lines are included:
                //initialise hand positions
                leftHandPos.x = 0;
                leftHandPos.y = 0;
                leftHandPos.z = 0;
                rightHandPos.x = 0;
                rightHandPos.y = 0;
                rightHandPos.z = 0;

                bGotNewGesture = false;
                latestGesture = CClassifier::GestureType::Left_Circular;

                //It doesn't fail when these lines are included:

                //Create sensor
                mySensor = new CNuiSensor();

                //Create and initialise classifier
                myClassifier = new CGlobalClassifier(mySensor, frameRate, jointFeaturesCount);
                myClassifier->Initialise("model.dat");

                //Initialise sensor
                mySensor->Nui_Init();
            };

            ~MyKinect(void)
            {
            };

        private:
            CGlobalClassifier *myClassifier;
            CNuiSensor *mySensor;
            bool bGotNewGesture;
            CClassifier::GestureType latestGesture;
            VECTOR leftHandPos;
            VECTOR rightHandPos;
        };
    };

这是C#import wrapper:

struct UnmanWrap
{
    //Import constructor
    [DllImport("MyKinectDll.dll", EntryPoint = "??0MyKinect@MyKinectDll@@QAE@XZ",
               CallingConvention = CallingConvention.ThisCall)]
    public static extern void Constructor(ref UnmanWrap t);
}

public class MyKinectWrap
{
    private UnmanWrap unman;

    public MyKinectWrap()
    {
        //Add a path to location of the DLL file.
        Environment.SetEnvironmentVariable("PATH","D:\\Jeff\\4YP\\MyKinectDll2\\Release");

        this.unman = new UnmanWrap();
        UnmanWrap.Constructor(ref this.unman);
    }
}

0 个答案:

没有答案