【发布时间】:2011-12-05 09:16:15
【问题描述】:
这是我的问题。 我在 C# 中包装了一个 C dll。为此,我首先编写了一个 C++/CLI 包装器。本机 C 库链接到 C++/CLI 包装器。 (C++/cli 项目中的链接器属性)。
现在所有的组织方式如下: - 原生 C .lib:x86 和 64 位。
- 1 解决方案包含 2 个项目:
- 与本机 C .lib 链接的 C++/CLI 包装器项目
- 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# 项目是一个 CLASS LIBRARY,供 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...
【问题讨论】:
-
我没有看到任何问题。如果要针对 x64 和 x86,您需要为每个平台 (C/C++) 编译单独的文件,并根据它所在的平台在 C# 应用程序中引用正确的库。您还可以决定您只想通过使用对 x86 或 x64 编译库的引用来强制某个平台。我没有看到“?”随时编辑您的问题并明确您的问题。
-
“任何 CPU”是硬性要求吗?懒惰的程序员对此的解决方案只是为 x86 编译,因为它运行在 x64 中。
-
是的,这是一个硬性要求。 C# 项目实际上是一个供客户端和服务器使用的库,可以安装在 64 位或 x86 上
-
这是一个部署问题。本机 DLL 不是问题,您可以给它们不同的名称并在链接器的 Additional Dependencies 设置中指定它们。问题是 C++/CLI 程序集。 CLR 可以根据 processorArchitecture 属性自动选择正确的程序集,但这需要将它们部署到 GAC。这需要两个安装程序。由于无论如何您都需要它们,简单的解决方案是只提供两种不同的安装程序,一种用于 32 位机器,另一种用于 64 位机器。每个都部署了正确风格的 DLL。
-
@IlianPinzon - 如果我的 C# 库是 x86,那么它不能被在 x64 架构上编译的客户端程序调用,任何 CPU...并且无法将此客户端更改为 x86。