您如何将结构写入内存中的某个位置,该位置将能够通过 ref 调用被引用并且不会被更改。
我一直在传递 ref 因为我需要一个指针来与 dll 通信并且值正在发生变化。不通过 ref 会引发“尝试读取或写入受保护的内存”错误。
想法?
在通过 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);
如果我理解正确,您只需要指定 InAttribute,并告诉 marshaller 结构必须仅编组一次,从 c# 到本机而不是向后!
[DllImport("somedll")]
public static extern void SomeMethod(
[In] ref SomeDataStruct value);
我们确实需要有关所涉及函数的更多信息才能给您一个很好的答案,但是您可以尝试使用 VirtualProtectEx 删除该内存区域的写入能力。
这假设您已经分配了一些空间并将您的信息存储在那里。您需要使用 PAGE_READONLY 作为该页面上的新保护常量调用 VirtualProtectEx。有关更多信息,请查看 MSDN: http: //msdn.microsoft.com/en-us/library/aa366899 (VS.85).aspx
是否要引用某些 Windows DLL? http://pinvoke.net包含很多方法定义。
如果您想了解有关特定方法调用的更多信息,请提供更多信息。