【问题标题】:MSBuild requiring DLL to be copied to BOTH .NET directory and current build directoryMSBuild 要求将 DLL 复制到 .NET 目录和当前构建目录
【发布时间】: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 版是免费的,因此几乎没有实际障碍。您可以轻松发现 &lt;HintPath&gt; 属性。
  • @Hans - 我实际上也尝试过使用 Visual Studio 2013 查看 Visual Studio 项目文件。HintPath 不适用于 UsingTasks。
  • @Adam,你找到解决方法了吗? HintPath 不能与 UsingTasks 一起工作真是太糟糕了。
  • @vulcanraven - 不幸的是,我仍然只是将它复制到两个位置。这种方式可以正常工作,但并不像我希望的那样干净,而且我还想知道为什么它只在我复制到两个位置时才有效。

标签: c# .net dll msbuild


【解决方案1】:

请您试试这个:- 在项目目录下创建一个目录“libraries” 将第三方 dll 复制到该文件夹​​

<Copy
    SourceFiles="D:\ThirdParty\MyDLL.dll"
    DestinationFolder="$(MSBuildProjectDirectory)\libraries"
/>

不要复制到 C:\Windows\Microsoft.NET\Framework\v4.0.30319

在任务中

<reference include="libraries\MyDll.dll">

然后尝试执行你的程序并告诉我会发生什么

【讨论】:

  • 它显示相同的错误(找不到 DLL)。我确认 DLL 实际上确实复制到了上面提到的库目录。我还运行了第二次,以防复制是异步完成的。
猜你喜欢
  • 2020-06-02
  • 2016-03-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2023-04-02
  • 2022-01-21
  • 2021-08-25
  • 2011-04-21
相关资源
最近更新 更多