MSBuild要求将DLL复制到.net目录和当前构建目录
本文关键字:构建 net DLL 复制 MSBuild | 更新日期: 2023-09-27 18:05:31
我不仅在寻找一种更干净的方法来做到这一点,而且还找出为什么我目前正在做的工作…
我正在使用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复制到当前构建目录或 C:'Windows'Microsoft.NET'Framework'v4.0.30319
而不是其他,那么它将不会构建。如果我把它复制到两个目录,只有这样它才会工作。
下面是我的代码的重要部分:
定义usertask
<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复制到两者。是否有更干净的方法来做到这一点,如果没有,为什么这样做?
你可以试试这个吗在项目目录下创建一个名为libraries的目录复制第三方dll到该文件夹
<Copy
SourceFiles="D:'ThirdParty'MyDLL.dll"
DestinationFolder="$(MSBuildProjectDirectory)'libraries"
/>
不要复制到C:'Windows' microt.net 'Framework'v4.0.30319
And in task
<reference include="libraries'MyDll.dll">
试着执行你的程序,然后告诉我发生了什么