在Windows 7中调试Windows.Devices.Sensors项目时立即访问冲突

时间:2015-02-09 20:25:33

标签: c++-cli interop

我有一个包含50多个非托管项目的大型解决方案。我最近在解决方案中添加了一个包含托管代码的项目。托管代码访问.NET dll中的Windows.Devices.Sensors。这个dll最终被非托管代码包装,并从另一个非托管项目调用。

我的问题是,在main()执行之前,我得到以下访问冲突。

Unhandled exception at 0x744b8ea0 in myApplication.exe: 0xC0000005: Access violation.

托管代码:

#using <Windows.winmd>
using namespace Windows::Devices::Sensors;

#include <math.h>

namespace TabletSensors 
{
     namespace NET
     {
        public ref class DotNetDllClass
        {
        public:
            DotNetDllClass()
            {
                Initialization();
            }

            ~DotNetDllClass()
            {
            }

            float* GetQuaternion()
            {
                OrientationSensorReading^ reading = _orientation->GetCurrentReading();

                if( reading != nullptr )
                {
                    float* quat = new float[4];

                    quat[0] = reading->Quaternion->X;
                    quat[1] = reading->Quaternion->Y;
                    quat[2] = reading->Quaternion->Z;
                    quat[3] = reading->Quaternion->W;

                    return quat;
                }
                else
                {
                    return NULL;
                }
            }
        private:
            void Initialization()
            {
                _orientation = OrientationSensor::GetDefault();

                if( _orientation != nullptr )
                {
                    _orientation->ReportInterval = 16;
                }
                else
                {
                    // not good ... throw exception or something
                }
            }

            OrientationSensor^ _orientation;
        };
    }
}

包装头文件:

namespace TabletSensors
{
    namespace NETWrapper 
    {
        class DLLEXPORT_SENSORS WrapperClass
        {
        public:
            __stdcall WrapperClass();

            __stdcall ~WrapperClass();

            float* __stdcall GetQuaternion();
        };
    }
}

Wrapper cpp文件:

#define MIXSENSORS_BUILD

#include <gcroot.h>

#include "DotNetWrapper.h"
#include "DotNetDll.h"


using namespace TabletSensors::NETWrapper;
using namespace TabletSensors::NET;

static gcroot<TabletSensors::NET::DotNetDllClass^> Sensors = nullptr;
static System::UInt16 refCount = 0;
#pragma managed 

inline TabletSensors::NET::DotNetDllClass^ GetSensors(void)
{
    return (TabletSensors::NET::DotNetDllClass^)Sensors;
}

void Init()
{
    ++refCount;

    if(GetSensors() == nullptr)
    {
        Sensors = gcnew TabletSensors::NET::DotNetDllClass();
    }
}

void CleanUp()
{
    if( refCount > 0 )
    {
        --refCount;
    }
}

float* GetQuaternion_()
{
    return Sensors->GetQuaternion();
}

#pragma unmanaged

TabletSensors::NETWrapper::WrapperClass::WrapperClass()
{
    Init();
}

TabletSensors::NETWrapper::WrapperClass::~WrapperClass()
{
    CleanUp();
}

float* TabletSensors::NETWrapper::WrapperClass::GetQuaternion()
{
    float* x = new float[4];
    return GetQuaternion_();
}

#pragma managed

非托管项目引用我的包装类:

#include "DotNetWrapper.h"
     .
     .
     .
void UnmanagedProject::Update()
{
     // if this line is present, I get an access violation without hitting any breakpoints.
     TabletSensors::NETWrapper::WrapperClass _tabletSensors;
     .
     .
     .
}

由于托管代码正在尝试访问平板电脑传感器,因此我理解为什么它无法在我的Windows 7桌面上运行。我不明白为什么它甚至不允许我调试我的代码。在发生访问冲突之前没有命中断点。

我真正想知道的是如何使用异常处理或#ifdef来防止这种崩溃的发生。但我的运气很少。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

修复是延迟加载托管DLL。允许应用程序运行,直到明确调用该DLL。感谢Ben Voight在这里的回答:https://stackoverflow.com/a/28467701/1454861