2016-11-08 1 views
-3

Je suis en train de concevoir une application client qui va répertorier plusieurs applications que j'offre. Un utilisateur sélectionne l'application et appuie sur Exécuter, puis l'application est téléchargée et chargée dans le domaine de l'application client à l'aide de Assembly.Load. Voici l'extrait de l'endroit où il se charge: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); 

Problème: Deux des applications actuelles sont 32bit. Cependant, une de mes applications est 64bit. Question: Si je construis l'application cliente dans AnyCPU, sera-t-elle capable de charger à la fois les applications 32 bits ET l'application 64bits? Ou y a-t-il peut-être un paramètre qui le lance en 64 bits si la machine le supporte? Ce serait idéal, car je détecterais simplement s'ils sont en 32 bits/64 bits et les avertirais que l'application n'est pas supportée sur leur machine si c'est le cas.

Je vais tester cela moi-même, mais peut-être que quelqu'un pourrait me donner une sorte de conseil pour gérer cela.

Merci!

+0

Veuillez mettre le code 'avec formatage' dans votre question. Cela permet à tout le monde de voir et de modifier facilement votre code existant pour vous, et rend les questions/réponses beaucoup plus lisibles. – gravity

Répondre

0

Pour répondre à votre première question, si vous compilez l'application comme AnyCPU, vous laissez Windows décider quel CLR choisir. D'après mon expérience, cela revient généralement à Windows de choisir le x64 CLR sur les systèmes d'exploitation x64 et le x86 CLR sur les systèmes d'exploitation x86, mais je ne suis pas certain que ce soit toujours une garantie. AnyCPU ne signifie pas qu'il peut fonctionner dans les deux. Vous ne pourrez charger que la version de l'application qui correspond à l'architecture du CLR qui a chargé votre application client.

J'ai dû faire face à ce genre de problème dans certaines des applications avec lesquelles je travaille à l'endroit où je travaille. J'ai rencontré des bogues frustrants lorsque j'ai essayé d'interagir avec des applications compilées pour une architecture spécifique et des applications compilées pour AnyCPU. Pour rendre les choses plus faciles et plus prévisibles, j'ai fini par compiler les applications "AnyCPU" qui devaient interagir avec les applications "non AnyCPU" pour chaque architecture pour laquelle elles devaient interagir. Il y a peut-être des gens qui ont une configuration plus sophistiquée mais ça ne valait pas le mal de tête pour moi. Donc, la réponse à la deuxième question est plus de conseils. Je compilerais simplement l'application client pour une architecture spécifique afin que vous sachiez avec certitude quelle architecture vous avez affaire et que vous ajoutiez le code approprié pour détecter l'architecture. En fait, je pense que vous pourriez utiliser des directives de compilation pour stocker une sorte d'indicateur sur l'architecture sous laquelle vous exécutez ou même mettre une branche "détection" spécifique à chaque architecture dans la directive du compilateur et cela vous aiderait à faire l'avertissement que vous pensez faire. L'alternative est de garder l'application cliente comme AnyCPU et de détecter quelle architecture fonctionne actuellement l'application (si la mémoire est utilisée, IntPtr.Size == 8 pour les applications x64 mais il peut y avoir des méthodes plus fiables, pas sûr. ..) et ensuite seulement lancer les applications appropriées. Mais encore, vous devez être conscient du fait que, même avec AnyCPU, vous ne pouvez charger que des applications de l'architecture spécifique du CLR qui exécute votre application client AnyCPU.

Est-ce que cela a du sens?

+0

Ouais! Cela a du sens. Et je vais certainement faire des contrôles pour l'architecture avant de leur permettre d'exécuter l'application 64 bits ainsi. Donc, à la fin, je dois faire quelques expériences. Et je pourrais toujours sortir un client 32 bits et un client 64 bits comme le font certaines personnes. – DynamicKeyword

+0

Heureux que cela ait du sens. Expérimenter sera bon. Il y a plusieurs façons d'y parvenir et vous devez trouver la meilleure solution pour vous. :) – greyseal96

0

Vous devez construire tous vos binaires dans AnyCPU. De cette façon, sur un système d'exploitation 64 bits, ils fonctionneront en 64 bits et sur un système d'exploitation 32 bits, ils fonctionneront en 32 bits. Si vous compilez en x64, il ne fonctionnera pas du tout sur un système d'exploitation 32 bits. Si vous compilez en x86, vous serez toujours exécuté en 32 bits, même sur un système d'exploitation 64 bits. La règle finale est que vous ne pouvez pas mélanger les cases & match x86 et x64 dans le même processus. Les incompatibles échoueront à charger.