【问题标题】:How to check if '32-bit prefered' is toggled using visual studio variables如何检查是否使用 Visual Studio 变量切换了“首选 32 位”
【发布时间】:2019-12-17 18:40:42
【问题描述】:

我制作了一个包含托管和非托管代码的 NuGet 包。托管代码使用 C# 编写并支持 AnyCPU,而非托管代码使用 C++ 编写并具有 32 位和 64 位版本。此包中的托管代码依赖于非托管代码。我的包的结构是这样的:

\build
     \x86
          unmanaged.dll
     \x64
          unmanaged.dll
     package.targets
\lib
     \net472
          managed.dll

在我的“.targets”文件中,我正在检查$(Platform) 变量以查看用户是否选择了x86x64AnyCPU,并将正确的非托管dll 复制到输出目录:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup Condition=" '$(Platform)' == 'x64' ">
    <Content Include="$(MSBuildThisFileDirectory)x64\unmanaged.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>unmanaged.dll</Link>
    </Content>
  </ItemGroup>

  <ItemGroup Condition=" '$(Platform)' == 'x86' OR '$(Platform)' == 'AnyCPU' ">
    <Content Include="$(MSBuildThisFileDirectory)x86\unmanaged.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>unmanaged.dll</Link>
    </Content>
  </ItemGroup>

</Project>

预期的行为是,当用户构建他们的程序时,托管 dll 会根据所选的体系结构类型使用正确的非托管 dll 复制到输出目录。

当用户选择x86x64 时,一切都按预期工作,但在选择AnyCPU 时则不然。这是因为如果用户关闭了“32 位首选”并将 32 位非托管 dll 复制到输出目录,则会引发异常,指出 32 位非托管 dll 的格式与进程不匹配建筑,这是显而易见的。我想修改我的“.targets”文件,以便它可以识别“32 位首选”是打开还是关闭,并在构建程序时将正确的非托管 dll 复制到输出目录。是否有预定义的 Visual Studio 变量来检查是否切换了“32 位首选”?如果没有,是否有另一种方法可以检查“.targets”文件中的“32 位首选”选项?

【问题讨论】:

  • 这根本没有帮助。未选中“首选 32 位”并不意味着您不需要 32 位版本。当代码在 32 位操作系统上运行或当用户在类库中引用包并且该库用于 32 位目标应用程序时发生。后者是很常见的情况。考虑同时部署它们和select at runtime
  • 您可以尝试从您的解决方案中删除 AnyCPU 平台并仅使用 x86 和 x64
  • @HansPassant 如果非托管 32 位和非托管 64 位 dll 的名称相同怎么办?那么您将无法同时部署两者,而只能使用其中之一。
  • @PavelAnikhouski 当AnyCPU 被选中并且没有AnyCPU 的条件检查时会发生什么?
  • @NeemaNejad 如果从解决方案属性中删除,则无法选择

标签: c# windows nuget


【解决方案1】:

经过一些个人实验后,我找到了解决问题的方法。我卸载了我的项目以查看是否有任何与“32 位首选”相关的行,我发现有一行写着&lt;Prefer32Bit&gt;false&lt;/Prefer32Bit&gt;,这意味着我可以将其添加到我的“.targets”文件中:

  <ItemGroup Condition=" '$(Platform)' == 'AnyCPU' AND '$(Prefer32Bit)' == 'false' ">
    <Content Include="$(MSBuildThisFileDirectory)x64\unmanaged.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>unmanaged.dll</Link>
    </Content>
  </ItemGroup>

  <ItemGroup Condition=" '$(Platform)' == 'AnyCPU' AND '$(Prefer32Bit)' == 'true' ">
    <Content Include="$(MSBuildThisFileDirectory)x86\unmanaged.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>unmanaged.dll</Link>
    </Content>
  </ItemGroup>

我用我的程序对此进行了测试,看看它是否可以工作并且是成功的。

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 2016-02-02
    • 1970-01-01
    • 2020-04-07
    • 2017-01-09
    • 2018-08-19
    • 1970-01-01
    • 2010-09-22
    • 2012-08-17
    相关资源
    最近更新 更多