Assembly.Invoke() конфликтует с x86 и AnyCPU

Я использую Assembly.Load(), а затем EntryPoint.Invoke(null, null), чтобы запустить сборку .NET в памяти. Это работает, если только хост-процесс не x86, а исполняемая сборка AnyCPU. В этом случае исполняемая сборка выполняется в контексте x86 и, следовательно, работает со сбоями.

Есть ли способ выполнить объект Assemly в контексте AnyCPU, даже если хост-процесс - x86?


person bytecode77    schedule 10.02.2012    source источник
comment
Вы можете загрузить его в свой собственный AppDomain. Конечно, вам придется использовать технику удаленного общения, чтобы поговорить с ним (удаленное взаимодействие, WCF и т. д.).   -  person RQDQ    schedule 10.02.2012
comment
Почему сборка работает со сбоями при загрузке в x86, после сборки как AnyCPU? AnyCPU по определению должен работать на AnyCPU. Если что-то нарушило это, значит, где-то нарушается безопасность битности процесса.   -  person ssube    schedule 10.02.2012
comment
@RQDQ AppDomain не решит проблемы с разрядностью.   -  person vcsjones    schedule 11.02.2012
comment
@vcsjones - совершенно правильно. Я только что сделал реплику, и она с треском провалилась. <грамм>   -  person RQDQ    schedule 11.02.2012
comment
@peachykeen: Сборку нужно запускать с той же разрядностью, что и ОС, иначе работать не будет. Есть ли еще способ запустить его как x64 из хост-процесса x86?   -  person bytecode77    schedule 11.02.2012
comment
От, да; в, нет. Если сборка должна работать с той же разрядностью, что и ОС, а не с разрядностью программы, в которой она работает, вы уже что-то сломали и сборка не должна быть AnyCPU (поскольку она явно не< /я>). Все будет работать намного лучше, если вы сможете исправить сборку так, чтобы это был AnyCPU.   -  person ssube    schedule 11.02.2012


Ответы (1)


Выполнение сборки в контексте AnyCPU на самом деле не имеет смысла. Сборка, предназначенная для AnyCPU, будет JIT для 64-разрядной версии, если она загружена в 64-разрядный процесс, и до 32-разрядной версии для 32-разрядного процесса. Если эта сборка зависит от того, является ли хост-процесс 64-разрядным, то ее целевой платформой должен быть x64, а не любой процессор.

person Matt Dearing    schedule 10.02.2012
comment
Это верно в большинстве случаев. Что я пытаюсь сделать в рамках своего проекта, так это сжать сборку .NET. Сборка загружается и выполняется с помощью EntryPoint.Invoke. Если предполагается, что сборка будет работать как 64-разрядная, а она запускается как 32-разрядная, поскольку хост-процесс является 32-разрядным, она не будет работать. И наоборот, компиляция хост-процесса как AnyCPU не будет работать, если дочерний процесс - x86. - person bytecode77; 11.02.2012