0

c#を使用してiPhone用のアプリケーションを構築しているときに、このバグエラーを見つけました。このアプリケーションには、System.Objectインスタンスをcに渡すプラグインがあります。これを取得しましたが、どの部分が欠落しているかわかりません。

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)

4

1 に答える 1

1

問題は、マーシャラーがSystem.Objectをマーシャリングする方法を知らないことです。

IntPtrと、次のトリックを使用してSystem.ObjectをIntPtrに変換できると思います。

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

次に、オブジェクトをobjフィールドに格納し、ptrフィールドからポインターを読み戻します。

しかし、これがあなたがやろうとしていることへの正しいアプローチであるかどうかは完全にはわかりませんが、あなたが実際にやろうとしていることは私にはわかりません。

于 2012-08-02T19:52:24.520 に答える