Я пытаюсь вызвать управляемые события из нативного 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