InvalidCastException, реализующий .net события в нативном c ++ с помощью управляемой оболочки - PullRequest
1 голос
/ 09 декабря 2010

Я пытаюсь вызвать управляемые события из нативного c ++, используя управляемую обертку для нативного класса, а затем использую управляемую обертку через dll из C #.Тем не менее, я получаю InvalidCastException ошибку времени выполнения, которую я не знаю, как решить, или даже что это значит.Моя реализация выглядит следующим образом:

Заголовок для ManagedClass равен

#pragma once
#include "NativeClass.h"

using namespace System;
using namespace System::Runtime::InteropServices;

namespace NativeLibrary
{
     public delegate void ReportProgressDelegate(Double ^completionPercentage);

     public ref class ManagedClass
     {
         public:
         ManagedClass();

         event ReportProgressDelegate ^OnReportProgress;
         void RaiseReportProgress(Double ^completionPercentage);

         void CallTestFunction();

         private:
         NativeClass *_NativeClass;
         ReportProgressDelegate ^ReportProgress;
     };
}

, тогда как исходный файл ManagedClass равен

#include "stdafx.h"
#include "ManagedClass.h"
#include "TestFunction.h"

using namespace NativeLibrary;

ManagedClass::ManagedClass()
{
     _NativeClass = new NativeClass();
     ReportProgress = gcnew ReportProgressDelegate(this, &ManagedClass::RaiseReportProgress);
     _NativeClass->ProgressFunction = (void (*)(double))Marshal::GetFunctionPointerForDelegate(ReportProgress).ToPointer();

      void ManagedClass::RaiseReportProgress(System::Double ^completionPercentage)
      {
           OnReportProgress(completionPercentage);
      }

      void ManagedClass::CallTestFunction()
      {
           TestFunction(*_NativeClass);
      }
}

Здесь NativeClass определен в своем собственном файле заголовка

#pragma once

class NativeClass
{
     public:
     NativeClass() {};
     void (*ProgressFunction)(double);
};

как есть TestFunction

#pragma once
#include "NativeClass.h"

void TestFunction(NativeClass& nativeClass)
{
     nativeClass.ProgressFunction(50.0);
     return;
}

Я создал программу на C # для проверки события.Моя программа на C # состоит из

NativeLibrary.ManagedClass managedClass = new NativeLibrary.ManagedClass();
managedClass.OnReportProgress += new NativeLibrary.ReportProgressDelegate(managedClass_OnReportProgress);
managedClass.CallTestFunction();

, где событие managedClass_OnReportProgress определено как

void managedClass_OnReportProgress(ValueType completionPercentage)
{
     MessageBox.Show("report progress event triggered");
}

Проблема возникает, когда я вызываю функцию CallTestFunction.Когда я пошагово использую отладчик, он успешно делает это внутри родной TestFunction.Однако, когда он достигает закрывающей скобки TestFunction, я получаю ошибку времени выполнения: «InvalidCastException не обработан. Такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))» "

Я действительно не знаю, каккак решить эту проблему, или каков ее источник.Предложения? * * 1023

1 Ответ

1 голос
/ 09 декабря 2010
 public delegate void ReportProgressDelegate(Double ^completionPercentage);

Двойной тип значения.Вы должны использовать ^ только для ссылочных типов.Я предполагаю, что это бомбы, когда он пытается конвертировать в штучной упаковке двойной (объект) в родной двойнойУдалить ^

...