Как я могу проигнорировать поле при маршалинге структуры с P/Invoke

Принятие Вас имеет две программы, которые обрабатывают эти два файла, process_in.exe и process_out.exe:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%% ~nf является модификатором замены, который разворачивает %f до имени файла только. Посмотрите другие модификаторы в https://technet.microsoft.com/en-us/library/bb490909.aspx (на полпути ниже на страницу) или только в следующем ответе.

11
задан Thomas Levesque 9 November 2009 в 22:13
поделиться

2 ответа

Невозможно заставить среду CLR игнорировать поле. Вместо этого я бы использовал две структуры и, возможно, сделал бы одну часть другой.

struct MyNativeStructure 
{ 
    public int foo; 
    public int bar; 
} 

struct MyStructure 
{ 
    public MyNativeStruct native; 
    public int ignored; 
} 
6
ответ дан 3 December 2019 в 11:04
поделиться

Два метода:

  1. Используйте класс вместо структур: структуры всегда передаются по указателю на API Windows или другие собственные функции. Замена вызова на Dottis (MyStruct ref mystruct) с вызовом Dottis ([in, Out] MyClass) должен сделать трюк. После этого вы сделали это, вы можете просто получить доступ к вашим неразрушенным полям с методами.

  2. Как я уже говорил, структуры (почти) всегда проходят посредством ссылки: отсюда, следовательно, Callee ничего не знает о структуре Размеры: как насчет просто оставляя свои дополнительные поля, чтобы быть последними? При вызове родной функции, которая нуждается в указателе вашей структуры и размер структуры, просто ложь о своем размере, давая бы тот, который он будет без ваших дополнительных полей. Я не знаю, является ли это законный способ маршала такую ​​структуру обратно при получении его из родной функции. Вопрос на сторону: Поля класс процессов Marshaller отмечены личными? (Я надеюсь, что нет ...)

1
ответ дан 3 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: