1

您如何将结构写入内存中的某个位置,该位置将能够通过 ref 调用被引用并且不会被更改。

我一直在传递 ref 因为我需要一个指针来与 dll 通信并且值正在发生变化。不通过 ref 会引发“尝试读取或写入受保护的内存”错误。

想法?

4

4 回答 4

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);
于 2009-07-16T15:43:22.287 回答
0

如果我理解正确,您只需要指定 InAttribute,并告诉 marshaller 结构必须仅编组一次,从 c# 到本机而不是向后!

[DllImport("somedll")]
public static extern void SomeMethod(
    [In] ref SomeDataStruct value);
于 2009-07-17T14:27:50.910 回答
0

我们确实需要有关所涉及函数的更多信息才能给您一个很好的答案,但是您可以尝试使用 VirtualProtectEx 删除该内存区域的写入能力。

这假设您已经分配了一些空间并将您的信息存储在那里。您需要使用 PAGE_READONLY 作为该页面上的新保护常量调用 VirtualProtectEx。有关更多信息,请查看 MSDN: http: //msdn.microsoft.com/en-us/library/aa366899 (VS.85).aspx

于 2009-07-16T15:48:04.180 回答
0

是否要引用某些 Windows DLL? http://pinvoke.net包含很多方法定义。

如果您想了解有关特定方法调用的更多信息,请提供更多信息。

于 2009-07-16T15:56:37.890 回答