2016-10-05 36 views
3

我有項目Foo1依賴庫Foo2,其中Foo2依賴庫Foo3。.net項目爲什麼有時使用舊版本的dll?

Foo1是C#的GUI應用程序和Foo2是C++/CLI庫,Foo3是本地C++庫

foo2的/ Foo3的的Dll庫位於單獨的文件夾庫。 我注意到,有時候 Foo1使用老版本的Foo2.dll文件。它將Lib文件夾中的dll複製到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.生成後事件編輯器將爲您生成上一節。不一定需要您自己創建。

相關問題