依赖于C++/CLI的任何CPU依赖于本机C dll(c ++/cli的任何cpu)

nch*_*che 17 c c# 64-bit x86 c++-cli

这是我的问题.我在C#中包装一个C dll.为此,我首先编写了一个C++/CLI包装器.本机C库链接到C++/CLI包装器.(C++/cli项目中的链接器属性).

以下是它现在的组织方式: - 本机C .lib:x86和64bit.

  • 1解决方案包含2个项目:
    • C++/CLI包装器项目,链接到本机C .lib
    • C#项目引用C++/CLI项目

我的问题来自于我需要C#来定位"任何CPU".但是此选项在C++/CLI中不可用,因为它直接编译为本机代码.

我想解决这个问题的方法是: - 在x86中编译C++/CLI包装器,然后更改配置并编译为64位.当它编译时,我想告诉它基于平台采取哪个dll.即:如果在64位编译,链接64位本机C dll,否则如果x86,链接x86本机C. - 完成后,我应该能够在我的C#平台中拥有任何CPU目标.在这里,我将不再引用我的C++/CLI包装器项目,而是基于目标平台引用所需的dll.

我的问题是:

  • 如何告诉C++/CLI项目哪个.lib基于目标平台链接到哪个?
  • 如何告诉C#项目基于目标平台引用哪个C++/CLI dll?

让我补充一点,C#项目是一个由x86或x64客户端使用的CLASS LIBRARY.

我希望我的问题很清楚.任何帮助将不胜感激!

UPDATE基于:.NET项目中的条件引用,有可能摆脱警告吗?...

所以现在我使用条件编辑我的.csproj文件来引用dll,如下所示:

<ItemGroup>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=AMD64"
               Condition="$(Platform) == 'x64'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\x64\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=x86"
               Condition="$(Platform) == 'x86'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为$(平台)设置为AnyCPU ...

Yah*_*hia 22

你所描述的被称为"并排组装"(同一组件的两个版本,一个32和另一个64位)...我认为你会发现这些有用:

编辑 - 根据评论:

在这里,您可以找到完全符合您的场景的演练(.NET DLL包装引用本机DLL的C++/CLI DLL)http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-动态链接库/