2016-10-05 7 views
3

私はプロジェクトFoo1をライブラリFoo2に依存しています。ここでFoo2はライブラリFoo3に依存しています。.netプロジェクトでdllの古いバージョンが使用されることがあるのはなぜですか?

FOO1は、C#のGUIアプリケーションで、foo2ははC++/CLIのライブラリである、Foo3は++ライブラリ

foo2は/ Foo3ライブラリのDLLのネイティブCは、別のフォルダlibに置かれています。 私は気づいた、その時々 Foo1はFoo2.dllファイルの古いバージョンを使用しています。 DLLはLibフォルダからBinフォルダにコピーされ、そこに実行可能ファイルが保存され、それらのフォルダが使用されます。私がFoo3ライブラリを変更すると、Foo2プロジェクトも再構築されます。 DllはLibフォルダに置き換えられました。しかし、Binフォルダには更新されませんので、メインアプリケーションは古いdllを使います。

それはFoo1.csprojファイルからの作品は以下のとおりです。

<PropertyGroup> 
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
<ProjectGuid>{1D3976DD-23E4-4798-80A5-AFA8D34E9342}</ProjectGuid> 
<OutputType>WinExe</OutputType> 
<AppDesignerFolder>Properties</AppDesignerFolder> 
<RootNamespace>AuthorProtoNet</RootNamespace> 
<AssemblyName>AuthorProtoNet</AssemblyName> 
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 
<FileAlignment>512</FileAlignment> 
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> 
<WarningLevel>4</WarningLevel> 
<TargetFrameworkProfile /> 
<IsWebBootstrapper>false</IsWebBootstrapper> 
<!-- Predefined intermediate and output paths, defined for all configurations--> 
<IntermediateOutputPath>..\..\Temp\win-$(Platform)-$(Configuration)\$(AssemblyName)\</IntermediateOutputPath> 
<OutputPath>..\..\Bin\win-$(Platform)-$(Configuration)\</OutputPath> 
<PublishUrl>publish\</PublishUrl> 
<Install>true</Install> 
<InstallFrom>Disk</InstallFrom> 
<UpdateEnabled>false</UpdateEnabled> 
<UpdateMode>Foreground</UpdateMode> 
<UpdateInterval>7</UpdateInterval> 
<UpdateIntervalUnits>Days</UpdateIntervalUnits> 
<UpdatePeriodically>false</UpdatePeriodically> 
<UpdateRequired>false</UpdateRequired> 
<MapFileExtensions>true</MapFileExtensions> 
<ApplicationRevision>0</ApplicationRevision> 
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> 
<UseApplicationTrust>false</UseApplicationTrust> 
<BootstrapperEnabled>true</BootstrapperEnabled> 
</PropertyGroup> 
<Reference Include="Foo2"> 
    <HintPath>..\..\..\Lib\win-$(Platform) $(Configuration)\Foo2.dll</HintPath> 
</Reference> 
+0

"Foo2"はあなたがコントロールする別のプロジェクトですか、サードパーティのライブラリですか? "Foo2"はNuGetパッケージとして利用できますか? – EJoshuaS

+0

@EJoshuaS、Foo2は自分のプロジェクトです。 NuGetパッケージとして利用できないサードパーティ製のライブラリではありません – LmTinyToon

+0

あなたのプロジェクト構成を知らなくてもそれは分かりません。それらのすべてを同じソリューションに入れていますか?はいの場合、各プロジェクトの出力パスは何ですか?あなたのプロジェクトのプロジェクト( '.csproj')ファイルをそれぞれ共有できる方が良いでしょう。 –

答えて

2

MSBuildの管理されていないライブラリやプロジェクトへの参照を追加しません、したがって、(Visual Studioののデフォルトのビルドエンジン)(例えばC++ライブラリやプロジェクト。)それらはプロジェクトの出力ディレクトリにコピーされません。アンマネージライブラリをコピーする通常のソリューションは、ポストビルドイベントです。ポストビルドイベントは、プロジェクトの作成後にMSBuildが実行するユーザー設定のDOSコマンドです。

プロジェクトのポストビルドイベントは、ポストビルドイベントエディタで設定できます。プロジェクトのプロパティ>ビルドイベント>ビルド後イベントコマンドラインにあります。さらに、MSBuild DOSプロンプトはすべてのビルド変数にアクセスできます($(Configuration)$(Platform)など)。したがって、ビルド構成に従って適切なソースパスとデスティネーションパスを設定しても問題ありません。あなたの場合、以下のポストビルド構成(テストされていない)のようなものが動作するはずです。

<PropertyGroup> 
    <PostBuildEvent>xcopy \qy ..\..\..\Lib\win-$(Platform) $(Configuration)\Foo2.dll $(OutDir)</PostBuildEvent> 
</PropertyGroup> 

P.S.ビルド後のイベントエディタは、前のセクションを生成します。必ず自分で作成する必要はありません。

関連する問題