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 无法使指针无效。
我有一个包装器库,它使用调用非托管 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 无法使指针无效。