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复制到两者。是否有更干净的方法来做到这一点,如果没有,为什么这样做?

MSBuild要求将DLL复制到.net目录和当前构建目录

你可以试试这个吗在项目目录下创建一个名为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">

试着执行你的程序,然后告诉我发生了什么