问题是一般的,但我实际上是用Mono做的,而不是.net,所以如果有差异,我对它们的含义很感兴趣。
我有一个包含类的简单数据(不是因为其他原因的结构),它应该是blint,因为它包含int和double以及由双精度组成的较小结构。我通过DllImport静态方法将其发送到本机dll作为参考。
我的印象是,对于像这样的简单对象,会发生的事情是它被固定在托管内存中,托管内存中的地址作为引用/指针传递给本机代码(取决于如何声明本机代码,同样的事情),本机代码可以读取和写入,函数返回,托管对象取消固定,现在可以保存本机代码所写的更改。
其他人认为该对象是复制到一个本机内存块中,然后在其上运行本机代码,之后将数据复制回托管内存中的对象。当编组不必转换数据时,这显然会减少执行和浪费。
我做了一个测试,我注意到发送到本机代码的数据的地址,我发现它不会改变每个对象。 ObjectA获取一个地址,objectB获得另一个地址,每个地址都保留了我的地址,只要我测试了....但是虽然这似乎支持我对此的理解,但仍然可以对地址进行其他解释,所以我将不胜感激一个具体的解释,因为Mono文档没有提到固定blittable对象,而Microsoft文档。
额外的问题: 可能存在一个类(不是struct)只包含ushort,int和double的情况,它不是blittable而是需要副本吗?在Android上使用mono观察到,本机代码本机中的数据更改在管理端不可见(当不使用Out装饰时),似乎表明使用了复制而不是固定。
mono int可能与本机代码中的c ++ int不同,但是这样的数据大小和对齐问题不应该从托管端检测到,所以它如何知道"通过复制而不是钉扎来编组?在窗口测试中,这种不匹配只会导致数据出现乱码,正如预期的那样,这可能不是复制编组的原因。