2011-06-22 20 views
11

ほとんどの場合、C#コードである大規模なVS 2010ソリューションがありますが、C#プロジェクトが依存するいくつかのネイティブDLL(ユニットテストDLLを含む)があります。私たちはライブラリの32ビット版と64ビット版の両方をサポートしようとしています。そこで、ネイティブDLLを32ビットと64ビットとしてビルドします。問題は、多くのC#プロジェクトに、必要なネイティブDLLをプロジェクトのTargetDirにコピーするポストビルドイベントがあることです。ネイティブDLL(32ビットと64ビット)の2つの異なるバージョンが用意できたので、ネイティブDLLをコピーする正しいdirを指定できるようにする必要があります。C#プロジェクトのビルドイベントからVisual Studioソリューションレベルのプラットフォームにアクセスするにはどうすればよいですか?

copy $(SolutionDir)\NativeDll\$(Platform)\$(Configuration) $(TargetDir) 

しかし、$(プラットフォーム)プロジェクトのプラットフォームではなくソリューション・レベルのプラットフォームであるため、それが動作しません:私はもともと私は単にそのようなパスに$(プラットフォーム)を使用することができると思いました。この場合、$(プラットフォーム)は「任意のCPU」です。 C#プロジェクトのポストビルドイベントマクロを見ると、ビルドされているソリューションレベルのプラットフォームにアクセスする方法はないようです。私の目標を達成する良い方法はありますか?

+2

あなたはXCOPY/S/D/I/Yの代わりにコピーを使用する場合、あなたがより速く(変更されていないファイルをスキップします)を構築得られます。 –

答えて

2

プロジェクトのことは、単にテキストであるとは違って、私は、ソリューションのプラットフォームを信じています。私は過去にダウンしてい何

は次のとおりです。

  1. は、Win32と、溶液から「混合プラットフォーム」を削除(およびプロジェクトを追加した後にそう続けます)。

  2. ソリューションプラットフォームAnyCPU、x86、x64ですべてのC#DLLをAnyCPUとしてビルドするように設定します。 (Blendで開くことができる場合、またはソリューションに純粋な管理対象アプリケーションがある場合はAnyCPUを削除しないでください)

  3. x86ソリューションプラットフォームおよびx64でx86に構築するC#EXEおよび単体テストを設定するAny64ソリューションプラットフォームではまったく構築しないでください。

  4. ソリューションがx86の場合、すべてのネイティブをWin32でビルドし、$(ProjectDir)\ bin \ x86 \ $(構成)に出力し、binの代わりにパスのobjを使用して中間に設定します。 x64はx86とWin32の代わりにx64と同じです。

  5. 設定ユニットテストクラスは、全体の内容をコピーするために初期化する$(コンフィグ):事前に彼らはプロジェクトの設定名と相対パスからの依存されているネイティブのDLLをコピーするにはC#のEXEファイルとユニットテストのイベントを構築し設定し

  6. テストのbinディレクトリ(正しいプラットフォームと構成、もちろん)テストのアウトディレクトリに。 #DEBUGとunsafe sizeof(IntPtr)を使用して、テストのbinディレクトリを探す場所を指定します。

  7. 手動で(メモ帳を使用して)ソリューションの展開場所からx86/x64アセンブリを使用するソリューション外の.csprojファイルへの相対参照パスを追加します。パスには$(Platform)と$(Configuration) 。

マイクロソフトでは、Visual Studioでの32/64ビットのサポートが改善されています。

+0

素晴らしい情報!そして、Visual Studioで32/64ビットのサポートがうまくいくことは間違いありません。 –

+0

BTW for#4、なぜ中間と出力の両方のディレクトリに同じディレクトリ '$(Platform)\ $(Configuration)'を使用しないのですか? –

+0

最終的な出力は、ビルドイベント(DLL、PDB、リソース)を使用して簡単にコピーでき、中間体は簡単にコピーできません。それでも、*。*よりも優れたフィルタを備えたxcopyを推奨します。 (E.g * .dll、* .pdb、* .xml) –

1

私は自分で使っていませんが、ビルド→バッチビルドはおそらくあなたが望むものです。複数のプラットフォームを構築することができます。もちろん

http://msdn.microsoft.com/en-us/library/169az28z.aspx

、これは実際には解決のための「プラットフォーム」をアクセスすることはできませんが、あなたが個別にそれぞれのプラットフォームを構築しますので、する必要はありません。

更新: あなたは、ビルドを自動化し、以下の内容でバッチファイルを作成したい場合は

"c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv" ../solution.sln /rebuild "platform" 

ここで「リリース|どれCPUを」さ「プラットフォーム」、「リリース|のx86」などとビルドする必要がある各構成ごとに行を繰り返します。 Configuration Managerを使用して、x86およびx64のビルド用に各プロジェクトを設定し、必要なものを用意しておく必要があります。

2

これを実行しなければならないとき、私はすべてのアセンブリをAnyCPUではなくx86またはx64としてビルド可能にし、2つの出力パッケージを用意しました。あなたのプロセスが32ビットまたは64ビットのproriでなければならないことを知っているなら、AnyCPUには本当に意味がありません。

+0

これらは、ビット・ニュートラルとして提供したいライブラリ・アセンブリ(DLL)以外は同意します。こうすることで、私たちのクライアントは、依存する32ビットと64ビットの両方のネイティブDLLを提供する限り、32ビットまたは64ビットのプロセスでクライアントを使用することができます。 –

0

「アクティブソリューション構成」には同等のマクロプロパティはありません。

私は手動で(各設定/プラットフォームの組み合わせのために追加された新しいMyVarカスタムプロパティを参照)このように、すべての.csprojファイルにカスタムプロパティを追加することであることを示唆しているもの:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    ... 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    ... 
    <MyVar>MyDebugAnyCpu</MyVar> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    ... 
    <MyVar>MyReleaseAnyCpu</MyVar> 
    </PropertyGroup> 

あなたが使用することができます」をUnload project 'と' Edit MyProject.csproj 'メニューを使用して、Visual Studioで.csprojetを編集します。重要なことは、通常のGUIエディタを使用して保存しても、Visual Studioはこれらの「不明な」値を破棄しないことです。

はその後、ポストビルドイベントで、あなたはたとえば、これらの値を使用することができます。

copy $(SolutionDir)\$(MyVar)\$(Platform)\$(Configuration) $(TargetDir) 
関連する問題