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

标签 c++ c++-cli

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

相关文章:

visual-c++ - 在 C++/CLI 中嵌套命名空间

c++ - 自主实时人脸识别系统

c++ - 原始函数指针与 boost::bind 返回值

c++ - Qt:长期适应运行应用程序未修改/独立于显示分辨率

c++ - 从任务栏隐藏 "Close Window"选项

visual-c++ - 如何在托管 C++ 中获取字符串形式的属性名称

c++ - 如何在 ref 密封类中同时实现 IBuffer 和 IBufferByteAccess? (C++/客户体验)

c# - C++/CLI Dll 与 C# 连接问题

class - 非托管 var 作为托管类 c++ 的成员

c++ - 解决由于类之间的循环依赖而导致的构建错误