我的解决方案包括以下两个项目:
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)
答案 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>