如何将结构写入内存中可以通过ref调用引用的位置,而不是更改。
我一直在使用ref,因为我需要一个指针来与dll通信,并且值会发生变化。不通过ref会抛出“尝试读取或写入受保护的内存”错误。
思想?
答案 0 :(得分:3)
在通过ref传递它之前克隆它。显然,如果您将指向结构的指针传递给非托管代码,则无法在该位置强制执行内存的只读属性。由于这是一个结构,它可以这么简单:
如果你有这个,
private struct DataType
{
public int X;
public int Y;
}
private class NativeMethods
{
[DllImport("MyDll")]
public static extern void SomeMethod(ref DataType value);
}
然后之前的呼叫可能是:
DataType data = ...;
NativeMethods.SomeMethod(ref data);
之后的电话可能是:
DataType data = ...;
DataType temp = data;
NativeMethods.SomeMethod(ref temp);
答案 1 :(得分:0)
我们确实需要有关所涉及功能的更多信息,以便给出一个很好的答案,但您可以尝试使用VirtualProtectEx删除该内存区域的写入功能。
这假设您已经分配了一些空间并将信息存储在那里。您将要使用PAGE_READONLY调用VirtualProtectEx作为该页面上的新保护常量。有关详细信息,请查看MSDN:http://msdn.microsoft.com/en-us/library/aa366899(VS.85).aspx
答案 2 :(得分:0)
您想引用一些Windows DLL吗? http://pinvoke.net包含许多方法定义。
如果您想了解有关特定方法调用的更多信息,请提供更多信息。
答案 3 :(得分:0)
如果我理解正确,你只需要指定InAttribute,并告诉marshaller结构必须只被封送一次,从c#到本地而不是后退!
[DllImport("somedll")]
public static extern void SomeMethod(
[In] ref SomeDataStruct value);