从C++/CLI调用C++代码时,如何执行编组操作?

sha*_*oth 9 .net mixed-mode c++-cli marshalling

根据这个问题,可以使用C++/CLI 无缝地组合托管代码和非托管代码.我不太明白 - 不管怎么说管理和非托管之间都不应该有编组?

例如,我有InnerLibrary,它被编译为带有头文件的本机C++ .dll和调用InnerLibrary代码的C++/CLI OuterLibrary.会不会有编组?谁将实施它,它的成本是多少?

Han*_*ant 6

嗯,这是一个内置于C++/CLI编译器中的功能,称为C++ Interop.你可能会想到的黑魔法要少得多.JIT编译器生成与C++编译器生成的完全相同的机器代码.所有.NET值类型在C++中都具有直接等效值,因此不需要转换.它并不会自动处理引用类型,你必须自己做.pin_ptr <>,通常.

真正做的就是注入一些代码来处理从托管堆栈帧到非托管堆栈帧的转换.该代码在堆栈上放置一个特殊的"cookie",由垃圾收集器识别.这可以防止它进入非托管帧,并将非托管指针误识别为对象引用.这个代码并不多,在Release版本中花费大约5纳秒,给予或接受.


Tim*_*son 3

不必进行任何编组,因为 C++/CLI 能够发出直接进行调用的不安全代码。看一下 Reflector 中的一些 C++/CLI 代码——它看起来与 C# 非常不同。

这是 C# 无法做到的事情(至少,没有关键字unsafe和一些指针 hack),也是纯模式 C++/CLI 无法做到的事情(与 C# 的原因相同)。

.NET 不安全代码能够直接调用非托管函数;只是这种能力除了通过 C++/CLI 之外无法方便地使用。