x64 support
Atom
9/16/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 бита (ее же и подсовывать по умолчанию).

Tags:


Thanks:


aspirant

Avatar
Date: 9/17/2011
Reply


Mikhail Sukhov Go to
Может сделать поддержку 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.
Thanks:

Mikhail Sukhov

Avatar
Date: 9/17/2011
Reply


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


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

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

aspirant Go to

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


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

Alexander

Avatar
Date: 9/19/2011
Reply


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

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

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

Alexander

Avatar
Date: 9/19/2011
Reply


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

Mikhail Sukhov

Avatar
Date: 9/19/2011
Reply


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

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


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

Alexander Go to

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


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy