c#to c /cli到未妈妈的C 参考
C# to c++/cli to unamanged c++ ref
我有一个包装纸,它使用C /CLI,称为无管理的C 。我正在从C#打电话,并想通过ref a int号码。
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可能会在本机代码运行时运行(例如,由另一个线程触发)并在对象压实堆时移动。那将使指针无效。C /CLI编译器无法实现这一目标,如果您尝试将result
直接传递给本机函数,将大声投诉。C /CLI设计人员为托管参考选择不同的符号的基本原因(^
与*
和%
相对于&
)。
提供一个稳定的指针,最简单的方法是将指针传递给未存储在GC堆上的值。这样:
public:
void MethodCLI(int% result)
{
int temp = result;
UnmanagedFunction(&temp);
result = temp;
}
如果您需要传递对象而不是值,则pin_ptr
关键字将变得有用,它会暂时固定传递的对象,因此GC无法使指针无效。
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 避免在基于反向范围的for循环实现中悬挂参考
- 通用参考 l 值不复制对象
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- C++丢失了参考
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 矢量的通用参考
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- C++17 和静态临时生存期的参考扩展
- C++ 参考:这两个语句有什么区别?
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- c#to c /cli到未妈妈的C 参考