c ++ / cli:委托给使用native参数的managed方法

时间:2016-05-18 15:14:18

标签: delegates c++-cli mixed-mode

我想有一种方法来调用引用类的方法,该方法接受本机参数。创建委托似乎是最明显的选择,但它并不适用于这些方法。

请查看以下代码段

# model/my_shop/my_order.rb
class MyShop::MyOrder
  # ...
end
# model/my_shop/my_order_item.rb
class MyShop::MyOrderItem
  # ...
end

1 个答案:

答案 0 :(得分:1)

错误消息显示:

  

错误C3225:' T'的通用类型参数不能是' Native',它必须是值类型或引用类型的句柄

它并不是说你不能通过该方法制作代表,只是因为你无法将其表示为Action<Native>

您可以声明自己的委托类型,也可以使用有效的参数在通用中使用。

使用您自己的委托类型

public delegate void ActionOfNative(Native n);

auto del3 = gcnew ActionOfNative(m, &Managed::method3); // ok

使用有效的参数在通用

中使用

这确实会改变您传递的参数的语义,但您可以改为传递指针。 IntPtr类型实际上与void*相同。您可以将其用作参数类型。不过,您必须自己将IntPtr转换回Native*

void method4(IntPtr ip){Native* np = (Native*)ip.ToPointer(); }

auto del4 = gcnew System::Action<IntPtr>(m, &Managed::method4); // ok

// Here's how you call del4.
Native n;
Native* np = &n;
IntPtr ip = IntPtr(np);

del4(IntPtr(&n));
del4(IntPtr(np));
del4(ip);