7

我们正在围绕非托管 DLL 创建 C# 包装器。非托管 DLL 有 32 位和 64 位版本。我们将托管包装器保留在其自己的项目中,以便我们可以将其构建为单独的组件并在解决方案中重用它。

然而,这会导致一些问题。由于 32 位和 64 位版本的非托管 DLL 具有相同的名称,因此我们无法将正确的非托管 DLL 移动到输出 (bin) 目录。如果构建配置是 x86,我们要复制 32 位版本,使用 x64 复制 64 位。只需一个处理器架构,这很容易实现。我们只是在我们的项目中包含非托管 DLL,并在文件上将 copy local 设置为 true。但是由于我们需要同时针对这两个目标,因此更加棘手。

我们在同一个解决方案/项目中找到了此链接Targeting both 32bit and 64bit with Visual Studio,但这似乎引用了机器上已经存在的一些 DLL。我们希望将正确版本的 DLL 复制到输出目录 (bin)。

任何有关如何解决此问题的提示或技术都非常受欢迎。

4

5 回答 5

5

我刚刚使用 FreeImage 库的 .Net 包装器解决了同样的问题。我所做的是创建两种构建配置,一种用于 x86,另一种用于 x64,用于引用托管包装器的项目。我在项目文件的 AfterBuild 目标中添加了 msbuild 条件复制部分,如下所示:

  <Target Name="AfterBuild">
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" />
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" />
  </Target>
于 2010-01-14T16:06:52.990 回答
1

另一种选择是在 Visual Studio 中创建除 Debug 和 Release 之外的新配置......也许是 Debug32 和 Debug64 等。配置设置之一是 CPU 架构。

然后在项目的构建后事件中,您可以使用平台名称宏作为条件执行老式 if/else 语句...

或者,如果您在解决方案中使用平台名称作为存储非托管 dll 的子目录,则可以使用平台名称从目录复制到 bin 目录。

于 2010-01-14T15:43:04.720 回答
1

在这种情况下,您可能想考虑使用 MSBuild 之类的东西来控制您的构建。然后你可以有一个编译标志用于进行 32 或 64 位编译。通过这样做,它还允许您控制您推送的 dll。这听起来像是你最好的选择。如果你不喜欢 msbuild,你也可以使用 nant。

于 2010-01-14T15:23:12.917 回答
1

我们一直在处理我们的项目。

我们有一个具有 32 位和 64 位版本的非托管 C++ DLL,以及一个使用 P/Invoke 调用非托管 DLL 的 C# 项目。

对于 C++ DLL,它的目标路径是:

$(平台名称)\$(配置名称)\$目标名称)

因此,32 位发布版本将进入 Win32\Release,而 64 位调试版本将进入 x64\Debug。

在 C# 项目中,我们删除了“Any CPU”配置,并将其替换为新的“x86”配置和“x64”配置。它的输出目录类似于非托管 C++ DLL,除了 .NET 编译器使用“x86”而 C++ 使用“Win32”来表示 32 位架构可执行文件。

在 C# 项目的构建后步骤中,我们将适当的非托管 DLL 复制到 C# 可执行文件的目标目录中。由于 C# 项目的每个体系结构和每个配置都有一个单独的输出目录,因此保持非托管 DLL 的哪个体系结构在哪个输出目录中是没有问题的;他们总是匹配。

为了进一步简化这一点,我建议您研究构建一个多文件程序集 ( http://msdn.microsoft.com/en-us/library/226t7yxe.aspx ),以便您的非托管 DLL 及其 C# 包装器都可以驻留在单个 . NET 程序集,完全省去复制它的麻烦。

于 2010-01-14T20:17:13.903 回答
0

如果您将配置设置为具有两个平台,一个用于 32 位和 64 位版本。然后将每个平台的引用设置为正确的 dll 版本,然后您需要做的就是在您的引用属性上设置复制本地标志,vsts 将为您处理这一切。不吵不闹。

于 2010-01-14T15:55:42.903 回答