【发布时间】:2014-05-28 17:41:45
【问题描述】:
我不仅在寻找一种更清洁的方法来做到这一点,而且还要找出我目前正在做的事情的原因......
我正在使用 MSBuild(不是 Visual Studio,只是 Notepad++ 并通过命令行调用 MSBuild)。 MSBuild 需要一个项目文件(就像 Visual Studio)来指导构建过程。作为构建的一部分,我在项目文件中使用 .NET 的 UsingTask 调用 C# 文件,以对数据库进行适当的更改。这样,当我在新计算机上安装它时,我只需要运行 MSBuild,构建将为我更新数据库。
C# 代码使用第三方 DLL。为了访问该 DLL,我需要将其从静态位置(例如 D:\ThirdParty\MyDLL.dll)复制到当前构建目录。那部分没问题。奇怪的是它也需要我将DLL复制到C:\Windows\Microsoft.NET\Framework\v4.0.30319。如果我将 DLL 复制到 either 当前构建目录 或 C:\Windows\Microsoft.NET\Framework\v4.0.30319 而不是另一个,那么它将不会构建。如果我将它复制到 both 目录,只有这样它才能工作。
以下是我的代码的重要部分:
定义 UsingTask
<UsingTask
TaskName="UpdateDB"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup />
<Task>
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data.Linq" />
<Reference Include="MyDLL.dll" />
<Reference Include="System.Xml" />
<Using Namespace="MyDLL.Db.Foo" />
<Code Type="Class" Language="cs" Source="UpdateDB.cs" />
</Task>
</UsingTask>
复制 DLL...
<Copy
SourceFiles="D:\ThirdParty\MyDLL.dll"
DestinationFolder="$(MSBuildToolsPath)"
/>
<Copy
SourceFiles="D:\ThirdParty\MyDLL.dll"
DestinationFolder="$(MSBuildProjectDirectory)"
/>
调用上面定义的 UsingTask...
<UpdateDB />
所以我想知道为什么我需要将 DLL 复制到两个位置,而不仅仅是一个或另一个。我通过从两个目录中删除 DLL 并将其复制到其中一个目录中反复测试了这一点。仅当我将 DLL 复制到两者时它才有效。有没有更清洁的方法来做到这一点,如果没有,为什么会这样?
【问题讨论】:
-
这是一种非常低效的方法。只需了解 Visual Studio 如何解决问题,Express 版是免费的,因此几乎没有实际障碍。您可以轻松发现
<HintPath>属性。 -
@Hans - 我实际上也尝试过使用 Visual Studio 2013 查看 Visual Studio 项目文件。HintPath 不适用于 UsingTasks。
-
@Adam,你找到解决方法了吗? HintPath 不能与 UsingTasks 一起工作真是太糟糕了。
-
@vulcanraven - 不幸的是,我仍然只是将它复制到两个位置。这种方式可以正常工作,但并不像我希望的那样干净,而且我还想知道为什么它只在我复制到两个位置时才有效。