我有一个包装器库,它使用调用非托管 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&
完全相同的句法。
但是,它可能在运行时是一个“内部指针”。例如,您可以在 C# 代码中传递类对象的字段。存储在 GC 堆上,这是一个重要的细节。 GC 可能会在 native 代码运行时运行(例如,由另一个线程触发)并在压缩堆时移动对象。那将使指针无效。 C++/CLI 编译器不允许这种情况发生,如果您尝试将 result
直接传递给 native 函数,它会大声提示。 C++/CLI 设计者为托管引用选择不同符号的基本原因(^
vs *
和 %
vs &
).
需要提供一个稳定的指针,最简单的方法是传递一个指向未存储在 GC 堆上的值的指针。像这样:
public:
void MethodCLI(int% result)
{
int temp = result;
UnmanagedFunction(&temp);
result = temp;
}
如果您需要传递一个对象而不是一个值,pin_ptr
关键字会变得很有用,它会临时固定传递的对象,因此 GC 无法使指针无效。
关于c++ - C# 到 c++/cli 到 unamanged c++ ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42606577/