通过NAnt和Visual Studio构建 - 一个dll丢失

时间:2008-11-06 21:59:17

标签: visual-studio-2008 dll msbuild nant reference

我的解决方案包括以下两个项目:

  • MyNamespace.Web.UI
  • MyNamespace.Web.Core

UI引用Core和Core引用Foobar.dll,除了我的库之外它不存在。当我从Visual Studio 2008构建时,Foobar.dll按预期在UI项目的Bin文件夹中。我确定它在构建之前不存在。

但是当我从NAnt构建时,它不存在,这会导致运行时异常。这是NAnt任务的样子:

<target name="compile" depends="init">
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Clean /p:Configuration=${project.config} /v:q" workingdir="." />
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Rebuild /p:Configuration=${project.config} /v:q" workingdir="." />
</target>

在VS中,我尝试在发布模式和调试模式下构建,重建,重建等等。它总是一样的。 Foobar.dll在Bin文件夹中。 NAnt不是这样。我也试过从NAnt脚本中删除/ m开关。结果相同。

在Core中引用了其他几个dll,而不是在UI中,它们在NAnt构建之后按预期显示在Bin中。

我的解决方法是在UI项目中引用Foobar.dll,但这让我有点恶心。知道是什么导致这个吗?

(顺便说一下,Foobar.dll实际上是NHibernate.ProxyGenerators.CastleDynamicProxy.dll)

5 个答案:

答案 0 :(得分:2)

你可能在VS中选择“复制本地”,隐含地,在构建之前将其复制到本地。你需要在NAnt中模仿它。

类似于您可以从Visual Studio为Web项目执行“发布”的原因,但是对于命令行,您必须构建并将输出复制到您要去的任何位置。

答案 1 :(得分:1)

我以前在NantContrib中使用过MSBuild任务,它似乎将库dll复制到bin文件夹中。虽然这并没有真正解释为什么你的方法不起作用,但我假设你的目标是让它构建,而不是弄清楚为什么它不会构建

答案 2 :(得分:0)

在我做过的一些事情中,我已经使用NAnt的copy task将DLL复制到bin目录中,以便构建项目。我不知道这是否是最好的做法,但它确实有效。

答案 3 :(得分:0)

我同意科里的观点。由于您正在向msbuild进行炮轰,因此您需要确保将任何第三方(您的或其他)dll复制到您的bin或输出文件夹中。

在运行任务之前,您可以使用该任务在nant中执行此操作。那一切都应该没问题。

唯一的问题是你必须知道在msbuild任务运行之前把它放在哪里,所以你可能必须先创建文件夹结构,并希望msbuild不会将其删除。

希望有所帮助。

答案 4 :(得分:0)

我遇到过类似的问题。我通过明确添加

解决了这个问题
  

&LT;私人和GT;真&LT; /私人和GT;

在.csproj文件中的引用内,该文件应强制复制本地。

<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\lib\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
  <Private>True</Private>
</Reference>