Здравствуйте, robot01, Вы писали:
R>Это конечно решение но хочется что бы все было прекрасно, а приведение типов мне прекрасным не кажется.
Т.е. это значение -- вовсе не указатель, а настоящее числовое значение? Если так, то не ясно, зачем так сделано. Логичнее было бы использовать на unmanaged стороне тип с фиксированной разрядностью.
Предположим что есть некая библиотека написанная на C и скомпилированная для двух платформ x86 и x86_64, библиотека имеет функцию вида:
void test(long some_value)
Хочется вызывать эту библиотеку из .net приложения. Засада в том что размер длинного целого на платформе x86 будет 32 бита а на x86_64 64 бита. Думаю я что умные люди уже что то придумали на этот счет но найти ума не хватило.
Буду благодарен за подсказку.
Здравствуйте, Mab, Вы писали:
Mab>Здравствуйте, robot01, Вы писали:
R>>Это конечно решение но хочется что бы все было прекрасно, а приведение типов мне прекрасным не кажется. Mab>Т.е. это значение -- вовсе не указатель, а настоящее числовое значение? Если так, то не ясно, зачем так сделано. Логичнее было бы использовать на unmanaged стороне тип с фиксированной разрядностью.
Если рассматривать реальный пример то это битовая маска в которой хранятся всякие флажки. Я могу предположить почему разработчики библиотеки так поступили: они хотели что бы их библиотека была максимально доступна т.е. введи они какието структуры фиксированной длинны тогда разработчикам которые вызывают их библиотеку не из C программы (мне например) было бы гораздо труднее жить. Но в любом случае библиотека это некая данность, менять интерфейс которой хоть теоретически возможно (исходники доступны) на практике не реально.
Здравствуйте, robot01, Вы писали:
R>Если рассматривать реальный пример то это битовая маска в которой хранятся всякие флажки. Я могу предположить почему разработчики библиотеки так поступили: они хотели что бы их библиотека была максимально доступна т.е. введи они какието структуры фиксированной длинны тогда разработчикам которые вызывают их библиотеку не из C программы (мне например) было бы гораздо труднее жить. Но в любом случае библиотека это некая данность, менять интерфейс которой хоть теоретически возможно (исходники доступны) на практике не реально.
Даже если исходники недоступны то, всегда можно написать свой адаптер который, приведет интерфейс библиотеки к более приемлемому виду.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, robot01, Вы писали:
R>>Если рассматривать реальный пример то это битовая маска в которой хранятся всякие флажки.
_FR>И что, в этом платформенно-зависимом long-е может находится разное количество флагов, которое по-разному обрабатывается при разных разрядностях
Нет обрабатывается все одинаково, просто при 64 битной размерности верхнее двойное слово игнорируется. Не спрашивайте меня зачем оно все так, это выше моего понимания, думаю я таков дзен программирования на C.
Здравствуйте, robot01, Вы писали:
R>Предположим что есть некая библиотека написанная на C и скомпилированная для двух платформ x86 и x86_64, библиотека имеет функцию вида: R>void test(long some_value) R>Хочется вызывать эту библиотеку из .net приложения. Засада в том что размер длинного целого на платформе x86 будет 32 бита а на x86_64 64 бита. Думаю я что умные люди уже что то придумали на этот счет но найти ума не хватило. R>Буду благодарен за подсказку.
Спасибо все кто пытался помочь. Решение для потомков — [MarshalAs(UnmanagedType.SysInt)]