2016-11-08 6 views
-3

私が提供するいくつかのアプリケーションをリストするクライアントアプリケーションを設計しています。ユーザーがアプリケーションを選択してrunを押すと、アプリケーションがダウンロードされ、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); 

問題:現在のアプリケーションのうち2つは32ビットです。しかし私のアプリケーションの1つは64ビットです。

質問:AnyCPUでクライアントアプリケーションをビルドすると、32ビットアプリケーションと64ビットアプリケーションの両方をロードできますか?それとも、マシンがサポートしている場合は、64ビットで起動する設定ですか? 32ビット/ 64ビットであるかどうかを検出してそのアプリケーションがそのマシンでサポートされていないと警告するので、これは理想的です。

私はこれを自分でテストしますが、誰かがこれを処理するために何らかの助言を与えることができます。

ありがとうございます!

+0

あなたの質問に 'with formatting'というコードを入れてください。これにより、誰もがあなたのためにあなたの既存のコードを見て簡単に編集でき、質問/回答をはるかに読みやすくします。 – gravity

答えて

0

最初の質問に答えるには、アプリケーションをAnyCPUとしてコンパイルすると、WindowsでどのCLRを選択するかを決めることができます。私の経験では、通常、x64オペレーティングシステムではx64 CLRを、x86オペレーティングシステムではx86 CLRをWindowsが選択していますが、これは常に保証されているかどうかはわかりません。 AnyCPUは両方で動くことを意味するものではありません。クライアントアプリケーションをロードしたCLRのアーキテクチャに対応するアプリケーションのバージョンのみをロードすることができます。

私が働いている場所で働いているアプリケーションのいくつかでは、このようなことに対処しなければなりませんでした。私は、特定のアーキテクチャ用にコンパイルされたアプリケーションやAnyCPU用にコンパイルされたアプリケーションとの相互運用を試みると、不満を感じていました。より簡単で予測可能なものにするために、私は、「AnyCPU」アプリケーションをコンパイルしてしまいました。これらのアプリケーションは、相互に作用しなければならない各アーキテクチャの「Any Any以外の」ア​​プリケーションと対話しなければなりませんでした。より洗練された設定を持っている人がいるかもしれませんが、それは私の頭痛に値するものではありませんでした。

したがって、2番目の質問に対する回答は、より多くのアドバイスです。私は特定のアーキテクチャ用のクライアントアプリケーションをコンパイルするだけで、どのアーキテクチャを扱っているかを知ってから、適切なコードを追加してアーキテクチャを検出するだけです。実際、私は、あなたが実行しているアーキテクチャーに関するインジケーターのいくつかを格納するためにコンパイラー・ディレクティブを使用したり、コンパイラー・ディレクティブの各アーキテクチャーに固有の「検出」ブランチを配置して、あなたがやろうとしている警告。

クライアントアプリケーションをAnyCPUとして維持し、アプリケーションが現在実行されているアーキテクチャを検出する方法があります(メモリが使用されている場合、x64アプリケーションではIntPtr.Size == 8ですが、 ..)、適切なアプリケーションのみを起動します。しかし、AnyCPUを使用していても、AnyCPUクライアントアプリケーションを実行しているCLRの特定のアーキテクチャのアプリケーションのみをロードできるということに注意する必要があります。

それは意味がありますか?

+0

これは理にかなっています。そして、64ビットアプリケーションも実行できるようになる前に、私は確かにアーキテクチャのチェックを行っています。ですから、私は最後にいくつかの実験をしなければなりません。そして、私はいつも32ビットと64ビットのクライアントをリリースすることができます。 – DynamicKeyword

+0

うれしいことは嬉しいです。実験は良いでしょう。これを行うにはいくつかの方法があり、あなたにとって最適な方法を見つけなければなりません。 :) – greyseal96

0

AnyCPUにすべてのバイナリをビルドする必要があります。そうすれば、64ビットOSでは64ビット、32ビットOSでは32ビットとして動作します。 x64にコンパイルすると、32ビットOSではまったく動作しません。 x86にコンパイルすると、64ビットOSでも常に32ビットとして実行されます。最後の規則は、同じプロセスで&とx86とx64のビンをマッチさせることができないことです。不一致のものは読み込まれません。

関連する問題