C# 通过引用将字段传递到非托管代码是否安全?
通过引用将字段传递到非托管外部方法是否安全C# 通过引用将字段传递到非托管代码是否安全?,c#,.net,pinvoke,C#,.net,Pinvoke,通过引用将字段传递到非托管外部方法是否安全 [StructLayout(LayoutKind.Sequential)] struct SomeStruct { public int SomeValue; } class SomeClass { SomeStruct _someStruct; [DllImport("SomeLibrary.dll")] static extern void SomeExternMethod(ref SomeStruct some
[StructLayout(LayoutKind.Sequential)]
struct SomeStruct
{
public int SomeValue;
}
class SomeClass
{
SomeStruct _someStruct;
[DllImport("SomeLibrary.dll")]
static extern void SomeExternMethod(ref SomeStruct someStruct);
public void SomeMethod()
{
// Is this safe or do I have to pin the current instance of SomeClass?
SomeExternMethod(ref _someStruct);
}
}
p/Invoke将在调用期间固定由
ref
或out
传递的直接参数。它们将作为指针显示在非托管端
只要非托管代码不为以后保存指针,就可以了。如果它将保存指针以备以后使用,则需要使用
GCHandle.Alloc(pinted)
将指针固定到“later”表示的任何时候。p/Invoke将在调用期间固定由ref
或out
传递的直接参数。它们将作为指针显示在非托管端
只要非托管代码不为以后保存指针,就可以了。如果它将保存指针以备以后使用,那么您需要使用
GCHandle.Alloc(pinted)
将其锁定,直到“later”的意思出现。我查看了IL代码,它似乎使用了对字段的直接引用,这将支持我必须锁定它的想法。不过我想确定一下。这和传递任何其他变量没有什么区别。我看了一下IL代码,它似乎使用了对字段的直接引用,这将支持我必须固定它的想法。不过我想确定一下,这和传递其他变量没有什么区别