如何获取 ASP.NET MVC Publish 以将本机二进制文件复制到 bin 目录

How to get ASP.NET MVC Publish to copy over a native binary to the bin dir

我在 VS 2013 中创建了一个 ASP.NET MVC 4 网站。我依赖的库程序集之一包装了一个本机 dll。我在项目的 post-build 事件中将该本机 DLL 复制到项目的输出目录。这使我可以 运行 IIS Express 下的网站并且工作正常。但是,当我去发布站点时,本机 DLL 被留在了泥土中。理想情况下,我希望根据 Visual Studio 当前选择的平台发布 Win32 或 x64 本机 dll。有人知道如何让 Publish 命令获取本机 DLL 吗?

顺便说一句,我已经尝试过将 DLL "add link" 到项目并将生成操作设置为 None 并将 "Copy to Output Directory" 设置为始终复制的技巧。虽然这有效,但它仅适用于本机 dll 的一个特定位数。这不太理想。

您需要在您的项目中包含 dll,然后在 dll 上右键单击 select 属性,然后确保 "Copy to Output Directory" 设置为 "Copy Always"

您可以通过手动编辑向 .csproj(或 .vbproj)文件添加条件。

  1. 保存项目中的所有工作。
  2. 在解决方案资源管理器中右键单击项目节点,然后单击 Unload Project
  3. 整个项目将折叠成一个节点。右键单击该节点和 select Edit <Project Name>.csproj(或 .vbproj)。

向下滚动并查找您使用的 DLL。它应该看起来像:

<ItemGroup>
    <Content Include="bin\Release\x86\My.dll">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

复制它并添加一个条件。在这种情况下,您想根据平台更改它。这是一种方法。请注意,您应该分析项目文件以确定为您的特定配置添加的最佳条件。您还应该更改目录以匹配 32 位和 64 位 DLL 文件的(相对)位置。

<ItemGroup Condition=" '$(PlatformTarget)' == 'x86' ">
    <Content Include="bin$(Configuration)\x86\My.dll">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>
<ItemGroup Condition=" '$(PlatformTarget)' == 'x64' ">
    <Content Include="bin$(Configuration)\x64\My.dll">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

Visual Studio 显示不正确(它将显示损坏的 DLL link 和有效的 DLL link),但请放心,此方法会起作用。它还有助于理解 Visual Studio 项目文件只不过是一个 MSBuild 配置文件。因此,尽管 Visual Studio 不支持添加或显示条件或某些其他 MSBuild 选项的方法,但如果根据 MSBuild 文档进行配置,它们都将正常运行。