Код: Выделить всё
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);
}
Мне удалось вызвать метод, полученный через Reflection, в C++ без передачи параметров, но когда я попытался передать параметры, мне не удалось заставить его работать. Я подозреваю, что пользовательский метод должен принимать IntPtr и выполнять внутреннее преобразование данных, но этот подход неудобен для пользователя. В идеале все, что связано с C++ и управлением памятью, должно обрабатываться в фоновом режиме.
Вот мои конкретные вопросы:
- Как передать параметры (например, структуры) из C++ в метод C#, полученный с помощью Reflection?
- Когда я пытался передать параметры, я не столкнулся с ошибкой времени компиляции, но при во время выполнения вызов не удался. Какова вероятная причина этой проблемы?
Моя версия .NET — 8.0.110
Подробнее здесь: https://stackoverflow.com/questions/792 ... parameters
Мобильная версия