x64 support
Atom Ответить
16.09.2011


Может сделать поддержку x64? Я думаю через какое-то время будет уже релиз этого дистрибутива.

Предлагаю сделать это прозрачным механизмом, чтобы работало без перекомпиляции робота. Например, если робот собрать как AnyCPU, то он будет и под 32 и под 64 бита работать в родном режиме. Сейчас приходится робота собирать принудительно под x86 (32 бита).

В чем основная загвоздка. Дело в том, что названия классов, которые генерируются в сборке Interop.XXX для 32 и 64 бита - одни и те же. Тоесть, нужно научиться их переименовывать Interop.XXX32 и Interop.XXX64 (могу помочь как это сделать).

Далее, нужно описать COM модель Плазы через интерфейсы. Например, IConnectionWrapper, IStreamWrapper. И создать реализации интерфейсов, ConnectionWrapper32 ConnectionWrapper64. Каждый из них будет посылать вызовы только в свои сборки. Затем, нужно все места, где используются Плаза типы, переделать на использование интерфейсов. Соответственно, при старте нужно будет лишь определить, какой разрядности сейчас процессор и какую реализацию интерфейса нужно подсовывать. Делается просто, через typeof(IntPtr) == 4 -> x86.

Такую задачу нужно начинать с конца, тоесть сначала реализовать интерфейсы и реализацию для 32 бита (ее же и подсовывать по умолчанию).

Теги:


Спасибо:




5 Ответов
aspirant

Фотография
Дата: 17.09.2011
Ответить


Mikhail Sukhov Перейти
Может сделать поддержку x64? Я думаю через какое-то время будет уже релиз этого дистрибутива.

Предлагаю сделать это прозрачным механизмом, чтобы работало без перекомпиляции робота. Например, если робот собрать как AnyCPU, то он будет и под 32 и под 64 бита работать в родном режиме. Сейчас приходится робота собирать принудительно под x86 (32 бита).

В чем основная загвоздка. Дело в том, что названия классов, которые генерируются в сборке Interop.XXX для 32 и 64 бита - одни и те же. Тоесть, нужно научиться их переименовывать Interop.XXX32 и Interop.XXX64 (могу помочь как это сделать).

Далее, нужно описать COM модель Плазы через интерфейсы. Например, IConnectionWrapper, IStreamWrapper. И создать реализации интерфейсов, ConnectionWrapper32 ConnectionWrapper64. Каждый из них будет посылать вызовы только в свои сборки. Затем, нужно все места, где используются Плаза типы, переделать на использование интерфейсов. Соответственно, при старте нужно будет лишь определить, какой разрядности сейчас процессор и какую реализацию интерфейса нужно подсовывать. Делается просто, через typeof(IntPtr) == 4 -> x86.

Такую задачу нужно начинать с конца, тоесть сначала реализовать интерфейсы и реализацию для 32 бита (ее же и подсовывать по умолчанию).


x64 нужно только, если есть обращения к 64-битным native-библиотекам или нужно работать с огромной памятью. Может просто компилить под х86? У меня на Win7 (x64) нормально работает 32-битная версия роутера.

Вот, кстати, майкрософтовский пост на тему AnyCPU.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.09.2011
Ответить


aspirant Перейти
x64 нужно только, если есть обращения к 64-битным native-библиотекам или нужно работать с огромной памятью.


.NET под 32 бита выделяет всего 1.5 гига. Далее, OME. Это большой объем разве что для телефонов.Smile

В реальности есть неудобство при использовании бэк тестера, который прожорлив к памяти. Приходится бота перекомпилировать с x86 на x64 и обратно.

aspirant Перейти

Вот, кстати, майкрософтовский пост на тему AnyCPU.


Эта статья говорит о том, что с AnyCPU больше проблем (кто бы спорил). Но не противоречит о том, что переход на AnyCPU лучше, чем держать бота конкретно под архитектуру процессора.
Автор топика
Спасибо:

Alexander

Фотография
Дата: 19.09.2011
Ответить


Задачу с Interop я решил, namespace переименовал.

А как мы хотим решать задачу с классами - когда один и тот же класс, тот же CP2ConnectionClass, определён в 2х namespace'ах? Через интерфейсы тут не решишь, возникнет проблема с приведениями. Пока идей по решению нет у меня.

Есть предложение - сделать подключение того или иного namespace'a по define при билде. Соответственно просто собирать 2 библиотеки - для 32х и 64х и добавлять их обе в релиз. Так и с производительностью потерь точно не будет.
Спасибо:

Alexander

Фотография
Дата: 19.09.2011
Ответить


Положил на codeplex изменения с возможным билдом 64x версией коннектора. Он билдится в том случае, если собираем под x64 платформу. В остальных случаях используется 32x библиотека.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.09.2011
Ответить


Alexander Перейти
Задачу с Interop я решил, namespace переименовал.

А как мы хотим решать задачу с классами - когда один и тот же класс, тот же CP2ConnectionClass, определён в 2х namespace'ах? Через интерфейсы тут не решишь, возникнет проблема с приведениями. Пока идей по решению нет у меня.


Мне кажется, идея с врапперами ускользнула. Никакого кастинга между x86 и x64 типа данных делать естественно не нужно. Катинг должен быть между IConnectionWrapper и его реализацией.

Alexander Перейти

Есть предложение - сделать подключение того или иного namespace'a по define при билде. Соответственно просто собирать 2 библиотеки - для 32х и 64х и добавлять их обе в релиз. Так и с производительностью потерь точно не будет.


С производительностью проблем не будет ни при каких вариантах. А сейчас решение практически ничем не отличается от перекомпиляции примера под разные платформы.
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy