2016-02-19 1 views
-1

У меня есть два проекта в растворе:Как настроить решение для 32-разрядной winform, которая ссылается на 64-битную библиотеку классов?

MyWinForm - это 32-битный проект с пользовательским пользователем управляет

MyClassLibrary - это 64-битного проект, который требует 64-бит для математических операций

Я «принудительно» от Microsoft для создания пользовательских элементов управления, которые представляют собой 32-разрядные сборки. See here for reference

Я «вынужден» моей математической моделью требовать 64-битных математических операций.

Если я ссылаюсь на MyClassLibrary в пределах MyWinForm и поддерживаю его как 64-битную сборку, то мои математические операции завершаются успехом; однако я больше не могу использовать пользовательский элемент управления. Я получаю следующую ошибку, если попытаюсь: «Не удалось загрузить элемент панели инструментов, который будет удален», когда я попытаюсь перетащить мой пользовательский элемент управления на поверхность дизайнера.

Если я ссылаюсь на MyClassLibrary в пределах MyWinForm и поддерживаю его как 32-разрядную сборку, то мои математические операции завершаются с исключением OutOfMemory (из-за 32-разрядного ограничения максимального размера).

Как настроить мое решение, позволяющее ссылаться как на пользовательский элемент управления, так и на 64-разрядную библиотеку классов, избегая проблем?

Я действительно хотел бы иметь возможность использовать панель инструментов и поверхность дизайна. У меня есть подозрение, что мне нужно будет загрузить пользовательский элемент управления во время выполнения, чтобы динамический компилятор знал, как решить 32 или 64 бит. Это, по моему мнению, наносит ущерб использованию Visual IDE.

+0

Вы не можете использовать библиотеку 64b в процессе 32b, так как библиотека загружается в пространство процесса, поэтому должно быть 32b – Gusman

+0

Есть ли обходной путь? – sapbucket

+1

Ну, при первом нечем прямо, но вы можете создать два отдельных процесса: один для 32b графического интерфейса и другие с 64-битными математическими классами и взаимодействовать с ними с tcp/pipe/shared memory, вы можете запустить 32b, который запускает невидимый процесс, а затем вы можете смешивать вещи. Совет, переполнение стека происходит потому, что нет стека слева, вы пытались увеличить размер стека на 32-битный процесс? – Gusman

ответ

0

Решение является обходным решением. Я понял, что моя цель - использовать Visual Designer, который работает в 32-битном режиме, так что мне не нужно было писать какой-либо из моего собственного кода. Вот что я сделал:

  1. WinForms проект будет 32-бит.
  2. Создал custom user control.
  3. Спроектировать проект в 32-бит.
  4. Перетаскивание custom user control на поверхность дизайна.
  5. Указать все свойства custom user control. (цвет, размер, док-станция и т. д.)
  6. Объявление Form_OnLoad() метод.
  7. Скопируйте/вставьте весь автоматически сгенерированный код из кода конструктора, связанного с моим пользовательским элементом управления, до Form_OnLoad().
  8. Удалить все элементы дизайна с поверхности конструкции, связанные с custom user control. Это приведет к удалению автоматически сгенерированного кода в коде кода разработчика для custom user control.
  9. Построение и испытание: я вижу custom user control? yes..proceed.
  10. Переключите параметры сборки обратно в 64-разрядный для проекта WinForms.
  11. Построение и испытание: я вижу custom user control? yes..execute math function ... работает ли она без каких-либо исключений? да..продолжение

Это быстрое и грязное обходное решение не является идеальным - но было очень быстро реализовать. Переключение моего проекта на 32-битное временно для активации Visual IDE «не имеет большого значения» для этого проекта.

**** ИЗМЕНИТЬ К РЕШЕНИЮ ****

Не делать выше. Вместо этого см. Комментарий Ханса ниже.

Администраторы: извините за неряшливый пост, не стесняйтесь удалять это, поскольку я не знаю, поможет ли этот вопрос и ответ кому-либо, кроме меня.

+0

Несомненно, вы преследуете неправильное решение, проблема в том, что ваша математическая библиотека также используется в режиме дизайна. И умирает, потому что теперь он работает в 32-битном режиме. Вы не хотите использовать свою библиотеку в режиме разработки, нет на это никакого смысла. Не так много смысла выделять огромные объемы памяти в сборке Debug либо btw. –

+0

Если ваш графический интерфейс работает нормально как в 32-разрядной, так и в 64-разрядной версии, то вы можете оптимизировать процесс разработки, добавив еще один проект: (1) исполняемый файл «WinForms», 64-битная сборка, содержит только Program.cs (2) DLL библиотеки классов WinForms, которая содержит фактический UI, сборку AnyCPU, (3) библиотеку библиотеки классов Math, 64-битную сборку. В этом случае UI DLL должна загружаться как в 32-разрядные конструкторы, так и в 64-битное приложение, не требуя повторного использования настроек. –

+0

@ Ханы: вы абсолютно правы. Чтобы проверить вашу теорию, я создал интерфейсы для своей математической библиотеки. Я переместил эти интерфейсы в библиотеку классов «модель». Затем я полностью удалил ссылку на 64-битную математическую библиотеку из моего проекта winforms. Затем я изменил проект winforms на «AnyCpu» и проверил правильную работу. Нет ошибок. Спасибо вам, Ханс за точные наблюдения. – sapbucket