2015-02-09 97 views
0

我有一個包含50個非託管項目的大型解決方案。我最近在解決方案中添加了一個包含託管代碼的項目。託管代碼訪問.NET dll中的Windows.Devices.Sensors。這個DLL最終由非託管代碼包裝,並從另一個非託管項目中調用。在Windows 7中調試Windows.Devices.Sensors項目時立即訪問衝突

我的問題是,我甚至在執行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 

不受管理的項目引用我的包裝類:

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

由於託管代碼嘗試訪問Tablet傳感器,我明白爲什麼它不能在我的Windows 7桌面上工作。我不明白爲什麼它甚至不允許我調試我的代碼。在發生訪問衝突之前不會發生斷點。

我真想弄清楚的是如何使用異常處理或#ifdefs來防止這種崩潰的發生。但我運氣不多。

任何想法?

回答