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

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

我有一个包装器库,它使用调用非托管 C++ 的 c++/cli。 我正在从 c# 中调用它,并希望将一个 int 数字作为 ref 传递。

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& 的确切语法等价物。

但是,它 可能 在 运行 时成为 "interior pointer"。例如,您可以在 C# 代码中传递 class 对象的字段。存储在 GC 堆上,这是一个重要的细节。 GC 可能 运行 而本机代码是 运行ning(例如由另一个线程触发)并在压缩堆时移动对象。那将使指针无效。 C++/CLI 编译器不允许这种情况发生,如果您尝试将 result 直接传递给本机函数,它会大声抱怨。 C++/CLI 设计者为托管引用选择不同符号的基本原因(^*%&)。

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

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

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