Для Linux:
$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'open.*tnsnames.ora'
шоу что-то вроде этого:
open("/opt/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora",O_RDONLY)=7
Изменение на
$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'tnsnames.ora'
покажет все пути к файлам, которые перестали работать.
Вместо того, чтобы пытаться сделать это через манипуляции с указателем, вы должны переключить свой код на использование Mashal.PtrToStructure . Этот метод специально разработан для этого сценария.
Из RFC 1738 , где в URL-адресах разрешены символы:
Только буквенно-цифровые символы, специальные символы «$ -_. +! * '(),» и могут использоваться зарезервированные символы, используемые для их зарезервированных целей не закодированы в URL.
Зарезервированные символы: ";", "/", "?", ":", "@", "=" и "&", что означает, что вам потребуется URL-кодирование их, если вы хотите их использовать.
кажется странным, потому что вы должны уметь выполнять указанные выше операции на основе ограничения метода where T: structНе совсем. У вас могут быть необработанные указатели на неуправляемые типы . Это определено в спецификации языка C # (18.2) следующим образом:
В отличие от ссылок (значений ссылочных типов), указатели не отслеживаются сборщиком мусора - сборщик мусора не знает указателей и данных, на которые они указывают . По этой причине указателю не разрешается указывать на ссылку или на структуру, содержащую ссылки, а типом референта указателя должен быть неуправляемый тип . Это определено в спецификации языка C # (18.2) следующим образом:
В отличие от ссылок (значений ссылочных типов), указатели не отслеживаются сборщиком мусора - сборщик мусора не знает указателей и данных, на которые они указывают . По этой причине указателю не разрешается указывать на ссылку или на структуру, содержащую ссылки, а референтный тип указателя должен быть неуправляемым типом . Это определено в спецификации языка C # (18.2) следующим образом:
В отличие от ссылок (значений ссылочных типов), указатели не отслеживаются сборщиком мусора - сборщик мусора не знает указателей и данных, на которые они указывают . По этой причине указателю не разрешается указывать на ссылку или на структуру, содержащую ссылки, а типом референта указателя должен быть неуправляемый тип . Неуправляемый тип - это любой тип, который не является ссылочным типом и не содержит полей ссылочного типа ни на каком уровне вложенности. Другими словами, неуправляемый тип является одним из следующих:
sbyte
,byte
,short
,ushort
],int
,uint
,long
,ulong
,char
,float
,double
,decimal
илиbool
.- Любой enum-type .
- Any указатель-тип .
- Любой определяемый пользователем тип структуры , который содержит поля только неуправляемых типов .
Таким образом, существует довольно много ограничений, и для универсального метода ,
Т: struct
может или не может соответствовать им для любого конкретного экземпляра, поэтому конструкция вродеT *
является недопустимой. Было бы неплохо иметь специальное ограничение параметра универсального типа для охвата неуправляемых типов, но в его нынешнем виде в CLR его нет.
В какой-то момент я написал эту статью , объясняющую, как именно это сделать, но во много раз быстрее, чем Marshal.PtrToStructure. В примере кода используется динамическая генерация кода для копирования универсального типа T в / из потока битов.