C Dll импорт C # - PullRequest
       51

C Dll импорт C #

1 голос
/ 16 июля 2009

Как записать структуру в место в памяти, на которое можно ссылаться через вызов ref и НЕ изменять.

Я передавал ref, потому что мне нужен указатель для связи с DLL, и значения меняются. Не проходя мимо ref, выдается ошибка «Попытка чтения или записи в защищенную память».

Мысли

Ответы [ 4 ]

3 голосов
/ 16 июля 2009

Клонируйте его, прежде чем передать по реф. Очевидно, что если вы передаете указатель на свою структуру неуправляемому коду, у вас нет способа принудительно установить свойства памяти только для чтения в этом месте. Поскольку это структура, она может быть такой простой:

Если у вас есть это,

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);
0 голосов
/ 17 июля 2009

Если я правильно понимаю, вам просто нужно указать InAttribute и сообщить маршаллеру, что структура должна быть маршализована только один раз, из c # в родной, а не назад!

[DllImport("somedll")]
public static extern void SomeMethod(
    [In] ref SomeDataStruct value);
0 голосов
/ 16 июля 2009

Вы хотите сослаться на некоторые библиотеки DLL Windows? http://pinvoke.net содержит множество определений методов.

Если вам нужна дополнительная информация о вызове специального метода, просьба предоставить дополнительную информацию.

0 голосов
/ 16 июля 2009

Нам действительно нужно больше информации о задействованных функциях, чтобы дать вам отличный ответ, но вы можете попробовать удалить возможность записи в эту область памяти с помощью VirtualProtectEx.

Предполагается, что вы выделили немного места и сохранили там свою информацию. Вы захотите вызвать VirtualProtectEx с PAGE_READONLY в качестве новой константы защиты на этой странице. Для получения дополнительной информации проверьте MSDN: http://msdn.microsoft.com/en-us/library/aa366899(VS.85).aspx

...