这是我的问题。 我正在用 C# 包装一个 C dll。为此,我首先编写了一个 C++/CLI 包装器。 native C 库链接到 C++/CLI 包装器。 (C++/cli 项目中的链接器属性)。
现在是这样组织的: - native C .lib:x86 和 64 位。
- 1 个包含 2 个项目的解决方案:
- 链接到原生 C .lib 的 C++/CLI 包装器项目
- C# 项目引用 C++/CLI 项目
我的问题是我需要 C# 来定位“任何 CPU”。但此选项在 C++/CLI 中不可用,因为它直接编译为 native 代码。
我的解决方案是: - 在 x86 中编译 C++/CLI 包装器,然后更改配置并编译为 64 位。编译时,我想告诉它根据平台采用哪个 dll。即:如果以 64 位编译,则链接 64 位 native C dll,否则如果是 x86,则链接 x86 native C。 - 完成后,我应该能够在我的 C# 平台中拥有任何 CPU 目标。同样,我不会引用我的 C++/CLI 包装器项目,而是根据目标平台引用所需的 dll。
我的问题是:
- 如何根据目标平台告诉 C++/CLI 项目链接到哪个 .lib?
- 如何告诉 C# 项目根据目标平台引用哪个 C++/CLI dll?
让我补充一点,C# 项目是一个类库,供 x86 或 x64 客户端使用。
我希望我的问题足够清楚。任何帮助将不胜感激!
更新 基于:Conditional references in .NET project, possible to get rid of warning? ...
现在我已经编辑了我的 .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>
不幸的是,这不起作用,因为 $(Platform) 设置为 AnyCPU...
最佳答案
您所描述的被称为“并行程序集”(同一程序集的两个版本,一个 32 位和另一个 64 位)...我认为您会发现这些有帮助:
- Using Side-by-Side assemblies to load the x64 or x32 version of a DLL
- http://blogs.msdn.com/b/gauravseth/archive/2006/03/07/545104.aspx
- http://www.thescarms.com/dotnet/Assembly.aspx
编辑 - 根据评论:
在这里您可以找到完全适合您的场景的演练:.NET DLL wrapping C++/CLI DLL referencing a native DLL
关于c# - Any CPU dependent on C++/CLI dependent on native C dll (any cpu for c++/cli),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7727876/