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

Immediate Access Violation when debugging Windows.Devices.Sensors project in Windows 7

我有一个大型解决方案,其中包含 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();
        };
    }
}

包装器 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

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

#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 桌面上不起作用。我不明白为什么它根本不允许我调试我的代码。在发生访问冲突之前没有命中断点。

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

有什么想法吗?

解决方法是延迟加载托管 DLL。允许应用程序 运行 直到显式调用该 DLL。感谢 Ben Voight 在这里的回答: