Nano Hash - криптовалюты, майнинг, программирование

MarshalDirectiveException at (оболочка, управляемая в нативную)

Я обнаружил эту ошибку при создании приложения для iPhone с использованием С#. Это приложение имеет плагин, который передает экземпляр System.Object в c. Я получил это, и я не уверен, какая часть отсутствует!

Вот код С#:

public static void Call( System.IntPtr L, System.Delegate pDelegate)
{   
    MonoDelegateToPtr( L, 0, pDelegate.Method.Target, pDelegate.Method.Name, pDelegate.Method.GetParameters().Length);
}

[System.Runtime.InteropServices.DllImport("__Internal")]
static extern void MonoDelegateToPtr( System.IntPtr L, int pN, System.Object pObj, string pMethod, int pParamCount);

Вот код C:

extern "C" void MonoDelegateToPtr( lua_State* L, int pN, MonoObject* pObj, const char* pMethod, int pParamCount)
{
   MonoMethod *method;

   MonoObject *pObject;
   method = GetCSMethod( pObject, pMethod, pParamCount);
   lua_CFunction func = (lua_CFunction)[MonoUtility MonoDelToPtr: method];
   if( func==0)
   {
      printf("****ERROR DELEGATE TO FUNCTION PTR IS NULL%s\n", pMethod);
      return;
   }

   lua_pushcclosure( L, func, pN);
}

MonoMethod* GetCSMethod( MonoObject *pObj, const char* pMethod, int pParamsTotal)
{
   MonoClass *class = mono_object_get_class( pObj);
   MonoMethod   *methodDef = mono_class_get_method_from_name(  class, pMethod,   pParamsTotal);

   return mono_object_get_virtual_method((MonoObject*)objectInstance, methodDef);
}

Вот сообщение об ошибке:

MarshalDirectiveException

at (оболочка управляемого в собственный) CSharpToMonoClass:MonoDelegateToPtr (intptr,int,object,string,int)

02.08.2012

Ответы:


1

Проблема в том, что маршаллер не знает, как маршалировать System.Object.

Я считаю, что вы можете использовать IntPtr и следующий трюк для преобразования System.Object в IntPtr:

struct ObjWr {
    [FieldOffset (0)] IntPtr ptr;
    [FieldOffset (0)] object obj;
}

а затем сохранить объект в поле obj и прочитать указатель из поля ptr.

Однако я не совсем уверен, что это правильный подход к тому, что вы пытаетесь сделать, но мне не ясно, что вы на самом деле пытаетесь сделать, так что, может быть, вы можете объяснить это немного лучше?

02.08.2012
  • На самом деле я пытался решить проблему с обратным обратным вызовом в Mono iphone, создав оболочку для C #, которая отправляет экземпляр System.Object и будет обрабатываться в C. 03.08.2012
  • Существует другое встроенное решение, которое намного лучше, но оно работает только для делегатов статических методов: используйте Marshal.GetFunctionPointerForDelegate и украсьте статический метод атрибутом MonoPInvokeCallbackAttribute. 03.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..