gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:16:33 24 4
gpt4 key购买 nike

我有一个包装器库,它使用调用非托管 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com