13

大部分がC#コードである大規模なVS 2010ソリューションがありますが、さまざまなC#プロジェクトが依存するネイティブDLLがいくつかあります(単体テストDLLを含む)。現在、ライブラリの32ビットバージョンと64ビットバージョンの両方をサポートしようとしています。そのため、ネイティブDLLを32ビットおよび64ビットとしてビルドしています。問題は、多くのC#プロジェクトに、必要なネイティブDLLをプロジェクトのTargetDirにコピーするビルド後のイベントがあることです。ネイティブDLLの2つの異なるバージョン(32ビットと64ビット)があるので、ネイティブDLLをコピーする正しいディレクトリを指定できる必要があります。私は当初、次のようにパスで$(Platform)を使用できると思っていました。

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

ただし、$(Platform)はプロジェクトのプラットフォームであり、ソリューションレベルのプラットフォームではないため、これは機能しません。この場合、$(プラットフォーム)は「任意のCPU」です。C#プロジェクトのビルド後のイベントマクロを見ると、ビルド中のソリューションレベルのプラットフォームにアクセスする方法がないようです。私の目標を達成するためのより良い方法はありますか?

4

5 に答える 5

3

プロジェクトのプラットフォームとは異なり、ソリューションのプラットフォームは単なるテキストだと思います。

私が過去に持っているものは次のとおりです。

  1. ソリューションから Win32 と「混合プラットフォーム」を削除します (プロジェクトを追加した後も削除し続けます)。

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

  3. C# EXE と単体テストを、x86 ソリューション プラットフォームでは x86 でビルドし、x64 ソリューション プラットフォームでは x64 でビルドし、AnyCPU ソリューション プラットフォームではまったくビルドしないように設定します。

  4. ソリューションが x86 で、出力が $(ProjectDir)\bin\x86\$(Configuration) の場合、すべてのネイティブを Win32 でビルドするように設定します。x86 と Win32 の代わりに x64 と同じ x64。

  5. C# EXE と単体テストのビルド前イベントを設定して、プロジェクトの構成名: $(Config) を使用して相対パスから依存するネイティブ DLL をコピーします。

  6. 単体テストのクラスの初期化を設定して、テストの bin ディレクトリ (もちろん、正しいプラットフォームと構成) の内容全体をテストの out ディレクトリにコピーします。if #DEBUG と unsafe sizeof(IntPtr) を使用して、テストの bin ディレクトリを探す場所を指定します。

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

Microsoft: Visual Studio での 32/64 ビット サポートの改善が実際に行われるでしょう。

于 2011-06-22T21:12:56.497 に答える
2

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

于 2011-06-22T20:31:30.247 に答える
1

私自身は使ったことはありませんが、Build -> Batch Build はおそらくあなたが望むものでしょう。それを使用すると、複数のプラットフォームを構築できます。

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"

ここで、「プラットフォーム」は「Release|Any CPU」、「Release|x86」などで、構築する必要がある構成ごとにこの行を繰り返します。構成マネージャーを使用して、x86 および x64 のビルド用に各プロジェクトをセットアップすると、必要なものが得られるはずです。

于 2011-06-22T20:29:56.280 に答える
0

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

私が提案するのは、次のように、すべての .csproj ファイルにカスタム プロパティを手動で追加することです (MyVar構成とプラットフォームの組み合わせごとに追加された新しいカスタム プロパティを参照してください)。

<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>

[プロジェクトのアンロード] メニューと [MyProject.csproj の編集] メニューを使用して、Visual Studio で .csprojet を編集できます。知っておくべき重要なことは、通常の GUI エディターを使用して保存したとしても、Visual Studio はこれらの「不明な」値を破棄しないということです。

次に、ビルド後のイベントで、次のような値を使用できます。

copy $(SolutionDir)\$(MyVar)\$(Platform)\$(Configuration) $(TargetDir)
于 2011-06-22T21:00:23.887 に答える
0

Francesco Pretto には、これに役立つ拡張機能があります。いくつかの癖と欠陥があるようですが、それは始まりです。

http://visualstudiogallery.msdn.microsoft.com/619d92a2-4ead-410d-a105-135f7b4b4df9

ソースが github の場合:

https://github.com/ceztko/SolutionConfigurationName

于 2014-05-29T18:00:04.860 に答える