为什么.net项目有时会使用旧版本的dll?

时间:2016-10-05 16:02:48

标签: c# .net dll

我的项目Foo1依赖于库Foo2,其中Foo2依赖于库Foo3。

Foo1是c#gui应用程序,Foo2是C ++ / Cli库,Foo3是本机c ++库

Foo2 / Foo3库的Dll位于单独的文件夹Lib中。 我注意到,有时 Foo1使用旧版本的Foo2.dll文件。它将来自Lib文件夹的dll复制到Bin文件夹,在那里它保存可执行文件,并使用它们。当我在Foo3库中进行更改时,Foo2项目也会重建。在Lib文件夹中替换了Dll。但是它们在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>

1 个答案:

答案 0 :(得分:2)

MSBuild (Visual Studio的默认构建引擎)不会添加对非托管库和项目(例如C ++库或项目)的引用,因此它们不会复制到项目的输出目录中。复制非托管库的常用解决方案是使用构建后事件。构建后事件是用户配置的DOS命令,MSBuild在构建项目后执行。

您可以在其构建后事件编辑器中设置项目的构建后事件;你会发现在项目的属性&gt;构建活动&gt;构建后事件命令行。此外,MSBuild DOS提示符可以访问所有构建变量(例如$(Configuration)$(Platform)等)。因此,根据构建配置配置适当的源和目标路径应该不是问题。在你的情况下,类似下面的构建后配置(未经测试)应该可以工作。

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

P.S。构建后事件编辑器将为您生成上一节。不一定需要自己创建。