2011-01-18 9 views
5

当社の製品はC++プロジェクトの束に基づいていますが、現在はフロントエンドにC#プロジェクトを使用しています。私たちは現在64ビット版もやっています。
すべてのC#dllをAnyCPUとして構築することを計画しています。 C#プロジェクトは、共通のbinフォルダ内のC++ dllへの参照を持ちます。 x64をビルドすると、binフォルダーにはx64バージョンのC++ DLLが含まれ、Win32をビルドするとbinフォルダーには32ビットバージョンのC++ dllが含まれます。したがって、C#プロジェクトはAnyCPUを構築しますが、x64またはWin32のいずれかのC++ dllを含みます。
私の質問は、これは動作しますか?実行時には、実行しているexeに応じてすべてが32または64になりますが、プラットフォーム固有のdllを含むAnyCPUを対象とするプロジェクトを処理する時間をコンパイルできますか?あるいは、すべてのC#dllのプラットフォーム固有のバージョンを作る必要がありますか? ありがとうC#AnyCPUプロジェクトにプラットフォーム固有のdllが含まれている可能性があります

答えて

3

私が覚えている限り、これは機能します。

私は32ビットのDLLしか持っていませんでしたが、コンパイル時に起動時にクラッシュしました。したがって、64ビットのDLLをそこに置くと、C#を再コンパイルする必要はありません。

2

私はそれをしました。それはコンパイルの警告を出すが。

2

私は過去にこのようなアプローチを使用していましたが、うまくいきます。どのようなコンパイルの警告を得るのですか?

8

これは主に、適切なオペレーティングシステム用に適切なDLLが選択されている展開問題です。 x86用とx64用の2つのセットアッププロジェクトを作成するとかなり簡単です。

透明にすることも可能です。たとえば、EXEを含むディレクトリにx86とx64のサブディレクトリを作成し、そのサブディレクトリにDLLの32ビットと64ビットのビルドをそれぞれ入れます。起動時に、IntPtr.Sizeをチェックしてプロセスのビット数を確認します。それに応じて、Windowsが正しいDLLを見つけるようにSetDllDirectoryを適切にピンボケします。このように:

using System.Runtime.InteropServices; 
using System.Reflection; 
using System.IO; 
... 
     public static void SetupDllDirectory() { 
      string path = Assembly.GetEntryAssembly().Location; 
      path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86"); 
      bool ok = SetDllDirectory(path); 
      if (!ok) throw new System.ComponentModel.Win32Exception(); 
     } 

     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern bool SetDllDirectory(string path); 

DLLをコピーするにはポストビルドイベントを使用します。 Environment.SetEnvironmentVariable()を使用してディレクトリをPATH環境変数に追加することは、もう一つのアプローチです。

関連する問題