2016-11-08 3 views
-3

Я разрабатываю клиентское приложение, которое будет перечислять несколько приложений, которые я предлагаю. Пользователь выберет приложение и запустит его, затем приложение будет загружено и будет загружено в домен клиента клиента с помощью Assembly.Load. Вот фрагмент, где он загружается:Assembly.Load x86/x64/AnyCPU

 var vAsm = Assembly.Load(client.GetBase()); 
     var vEP = vAsm.EntryPoint; 
     var vSC = vAsm.GetType(vEP.DeclaringType.FullName).GetMethod("SetClient"); 
     var vInst = vAsm.CreateInstance(vEP.Name); 
     vSC.Invoke(vInst, new object[] { client, license }); 
     vEP.Invoke(vInst, null); 

Проблема: Два из текущих приложений - 32 бит. Однако одно из моих приложений - 64 бит.

Вопрос: Если я создам клиентское приложение в AnyCPU, он сможет загружать как 32-битные приложения, так и 64-битное приложение? Или может быть настройка, которая запускает ее на 64-битной, если машина поддерживает ее? Это было бы идеально, поскольку я бы просто обнаружил, что они 32bit/64bit и предупредит их, что одно приложение не поддерживается на их машине, если это так.

Я буду испытывать это сам, но, возможно, кто-то может дать мне какой-то совет, чтобы справиться с этим.

Спасибо!

+0

Пожалуйста, введите код 'с форматированием' в свой вопрос. Это позволяет каждому видеть и легко редактировать ваш существующий код для вас и делает вопросы/ответы более читаемыми. – gravity

ответ

0

Чтобы ответить на ваш первый вопрос, если вы скомпилируете приложение как AnyCPU, вы позволяете Windows решать, какую CLR выбрать. По моему опыту, обычно получается, что Windows выбирает x64 CLR для операционных систем x64 и x86 CLR для операционных систем x86, но я не уверен, что это всегда гарантия. AnyCPU не означает, что он запускается в обоих. Вы сможете загрузить только версию приложения, которая соответствует архитектуре CLR, которая загрузила ваше клиентское приложение.

Мне приходилось иметь дело с такими вещами в некоторых приложениях, с которыми я работаю в том месте, где я работаю. Я столкнулся с некоторыми разочаровывающими ошибками, когда я попытался взаимодействовать с приложениями, скомпилированными для конкретной архитектуры и приложений, скомпилированных для AnyCPU. Чтобы сделать вещи проще и более предсказуемыми, я просто закончил компиляцию приложений «AnyCPU», которым пришлось взаимодействовать с приложениями «без AnyCPU» для каждой архитектуры, для которой они должны были взаимодействовать. Возможно, есть люди, у которых более сложная установка, но для меня это не стоило.

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

Альтернативой является поддержание клиентского приложения как AnyCPU и определение архитектуры, в которой в настоящее время работает приложение (если память используется, это IntPtr.Size == 8 для приложений x64, но могут быть более надежные методы, не уверены. ..), а затем запускать только соответствующие приложения. Но все же вы должны помнить о том, что даже с AnyCPU вы можете загружать приложения только определенной архитектуры CLR, на которой выполняется ваше клиентское приложение AnyCPU.

Это имеет смысл?

+0

Да! Это имеет смысл. И я обязательно буду выполнять проверки архитектуры, прежде чем разрешать им запускать 64-битное приложение. Поэтому, в конце концов, мне нужно поэкспериментировать. И я всегда мог выпустить 32-битный и 64-битный клиент, как это делают некоторые люди. – DynamicKeyword

+0

Рад, что это имеет смысл. Экспериментировать будет хорошо. Есть несколько разных способов сделать это, и вам нужно выяснить, как это работает лучше всего для вас. :) – greyseal96

0

Вы должны создать все свои двоичные файлы в AnyCPU. Таким образом, в 64-битной ОС они будут работать как 64-разрядные, так и 32-разрядные ОС, они будут работать как 32-разрядные. Если вы скомпилируете x64, он вообще не будет работать на 32-разрядной ОС. Если вы компилируете x86, вы всегда будете работать как 32-разрядные, даже в 64-разрядной ОС. Конечным правилом является то, что вы не можете смешивать & совпадение x86 и x64 в одном и том же процессе. Несоответствующие не будут загружаться.

Смежные вопросы