c#to c /cli到未妈妈的C 参考

C# to c++/cli to unamanged c++ ref

本文关键字:妈妈 参考 cli c#to      更新时间:2023-10-16

我有一个包装纸,它使用C /CLI,称为无管理的C 。我正在从C#打电话,并想通过ref a int号码。

public void MethodA()
{
   int result = 0;
   MethodCLI(ref result);
}
public void MethodCLI(int result)
{
    //Singature of the method is
    //  UnmanagedC++(int* result);
    UnmanagedC++(result);
}

我该怎么做?

预先感谢

如果需要将值更新传播回C#代码(因此ref关键字很有意义),则必须将C /CLI参数声明为int% result。本机C 中int&的确切句法等效。

但是,它可能是运行时的"内部指针"。例如,您可以通过C#代码中的类对象的字段传递。存储在GC堆上,这是一个重要的细节。GC可能会在本机代码运行时运行(例如,由另一个线程触发)并在对象压实堆时移动。那将使指针无效。C /CLI编译器无法实现这一目标,如果您尝试将result直接传递给本机函数,将大声投诉。C /CLI设计人员为托管参考选择不同的符号的基本原因(^*%相对于&)。

提供一个稳定的指针,最简单的方法是将指针传递给未存储在GC堆上的值。这样:

public:
void MethodCLI(int% result)
{
    int temp = result;
    UnmanagedFunction(&temp);
    result = temp;
}

如果您需要传递对象而不是值,则pin_ptr关键字将变得有用,它会暂时固定传递的对象,因此GC无法使指针无效。