【问题标题】:How to get Visual Studios build system to understand unmanaged dependencies of managed dlls?如何让 Visual Studios 构建系统了解托管 dll 的非托管依赖项?
【发布时间】:2010-12-31 02:36:29
【问题描述】:

在构建托管代码时,Visual Studio 正确(并且递归地)将引用的托管项目的 dll 复制到正在构建的项目的输出文件夹中。

但是,如果其中一个引用是依赖于非托管 dll 的托管 DLL,则这些非托管 DLL 不会复制到输出文件夹,即使它们在同一解决方案中的相应项目被列为托管 DLL 的依赖项.

我意识到这个问题可以通过让所有项目使用相同的输出文件夹来解决。对于大多数项目,我们已经这样做了,但我们更喜欢将单元测试输出文件夹分开,这会导致使用托管 Dll 和非托管依赖项的单元测试出现上述问题。

我们现在使用的解决方案是一个预构建事件来复制必要的 DLL,但这会浪费时间并且容易出错,因为每个使用托管 DLL 的项目都需要重复它。

因此,我想知道是否有一种方法可以让构建系统了解它应该在决定复制托管 DLL 时始终复制托管 DLL 的非托管依赖项?

【问题讨论】:

    标签: visual-studio dll dependencies unmanaged managed


    【解决方案1】:

    一种解决方法似乎是将另一个节点添加到托管 DLL 项目中,命名非托管 DLL 并设置 Build Action =“None”,以及 Copy to Output Directory =“Copy if Newer”。

    编辑:对于构建 C++/CLR 项目,我认为这可行:

    添加节点,并将其构建工具设置为自定义构建工具。然后,在 Custom Build Step 页面中,将 Command 设置为 copy $(InputPath) $(OutDir) 并将 Outputs 设置为 $(OutDir)\$(InputFileName)。看起来应该可以。

    【讨论】:

    • 这听起来像是一个很好的解决方法。至少它以这种方式在一个位置进行管理。只要我有时间确保它正常工作,我就会尝试一下。但是,我仍然对是否有完全自动化的解决方案感兴趣。
    • 我相信该解决方案适用于托管 C# 项目。但是,我们方案中的托管项目是 C++ CLR 项目。在 C++ CLR 项目中,项目项没有像 C# 项目中那样的“复制到输出目录”属性。是否有另一种方法来指定这样的操作?
    • @Ziphnor:编辑了我的帖子以包含一个适用于 C++/CLR 项目的方法。
    • 请注意,C++/CLI 项目也可以将 <None Include="foo.dll"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory></None> 项手动编辑到项目文件的 ItemGroup 中,只是不支持通过属性页 UI 执行此操作。
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多