Как управлять развитием Snap-ins-ins-ins-ins in x86 и x64
-
30-09-2019 - |
Вопрос
В настоящее время я пишу Snapin PowerShell, который имеет определенные зависимости от смешано-монтажных узлов (сборки, содержащий нативный код), который специально предназначен для X64 или X86. У меня есть оба версии зависимой сборки, но мне интересно, как лучше всего управлять сборкой и развертыванием этого визина, в частности:
- Нужно ли иметь две версии Snapin, один x86 и один x64 и используйте две разные версии installutil для установки его, один раз для каждой архитектуры?
- Предполагая, что № 1 верно, рекомендуется ли установить две разные версии Snapin в различных «программных файлах» и «программных файлах (X86)» каталогов?
- Какой идеал (наименее хлопот) способ структурировать пару проектов, которые разделяют все, кроме единой ссылки, чтобы построить для двух разных архитектур?
- Если Snapin скомпилирован как «AnyCPU», и зависимые DLL, которые оба загружаются в GAC, будет нагрузка за выполнением правильной сборки из GAC на основе архитектуры в настоящее время хоста PowerShell?
- Есть ли щелчок динамически, во время выполнения, выберите, какой зависимый DLL загружается (если она не может, по разным причинам, быть установленным в GAC), не работая в головных болях с контекстами нагрузки с монтажом?
Решение 2
Я закончил создать модуль (спасибо, Ричард!), Но это не решило проблем, связанных с процессорной архитектурой. Чтобы решить, что я помещаю обе версии зависимой DLL в каталоге модуля, а в конструкторе каждого командлета я помещаю код инициализации (который выполняется только один раз) для загрузки соответствующей версии зависимой DLL.
Спасибо, все, для указателей.
Другие советы
Марк, у нас есть эта проблема с расширениями сообщества PowerShell с 32-битными и 64-разрядными версиями 7zip.dll. Вы можете довольно легко работать вокруг этого, пропитывая на LoadLibrary в начале вашего запуска Snapin (или прежде чем вам нужно позвонить на родной DLL). Затем вы можете проверить, если вы 32-битный или 64-битный процесс (INTPTR.Size), а затем загружаете вручную правильную DLL, используя LoadLibrary Pinvoke. После этого DLLLIMPORT («Yournative.dll») заметит, что DLL уже загружен и использует эту DLL.
Взгляните на эти два файла исходного кода PSCX:http://pscx.CodePlex.com/sourcecontrol/changeset/view/74794sprojectname=pscx#1358100. http://pscx.codeplex.com/sourcecontrol/changeset/view/74794sprojectname=pscx#1358102.