Как вызвать метод C# из C++ с параметрами?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как вызвать метод C# из C++ с параметрами?

Сообщение Anonymous »

Код: Выделить всё

using System;
using System.Runtime.InteropServices;
using System.Reflection;
public struct StructCreatedByUser
{
public int x;
public float anything;
public string name;
}

class Program
{
[DllImport("CppLibrary")]
private static extern void SetPointer(IntPtr ptr);

[DllImport("CppLibrary")]
private static extern void CallCppFunctionWithParam(IntPtr param);

public static void FunctionCreatedByUser(StructCreatedByUser data){
Console.WriteLine(data.x + "  " + data.anything + "   " + data.name );
}

static void Main()
{
StructCreatedByUser data = new StructCreatedByUser { x = 10, anything = 20.5f, name = "wedf" };
IntPtr param = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(StructCreatedByUser)));
Marshal.StructureToPtr(data, param, false);
IntPtr methodPtr = typeof(Program).GetMethod("FunctionCreatedByUser").MethodHandle.GetFunctionPointer();
SetPointer(methodPtr);
CallCppFunctionWithParam(param);

}
}

Код: Выделить всё

#include 
#include 
#include 

typedef void (*FunctionStorage)(void*);
FunctionStorage func;

extern "C" void SetPointer(void* methodPtr) {
func = reinterpret_cast(methodPtr);
}

extern "C" void CallCppFunctionWithParam(void* param) {
func(param);
}
Я пытаюсь избежать снижения производительности при использовании MethodInfo.Invoke() в C# Reflection, вызывая методы непосредственно из C++ с использованием манипуляций с памятью. Моя цель — полностью обойти Reflection во время выполнения.
Мне удалось вызвать метод, полученный через Reflection, в C++ без передачи параметров, но когда я попытался передать параметры, мне не удалось заставить его работать. Я подозреваю, что пользовательский метод должен принимать IntPtr и выполнять внутреннее преобразование данных, но этот подход неудобен для пользователя. В идеале все, что связано с C++ и управлением памятью, должно обрабатываться в фоновом режиме.
Вот мои конкретные вопросы:
  • Как передать параметры (например, структуры) из C++ в метод C#, полученный с помощью Reflection?
  • Когда я пытался передать параметры, я не столкнулся с ошибкой времени компиляции, но при во время выполнения вызов не удался. Какова вероятная причина этой проблемы?
Будем очень признательны за любые рекомендации или примеры реализации этой проблемы.
Моя версия .NET — 8.0.110

Подробнее здесь: https://stackoverflow.com/questions/792 ... parameters
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»