4

我经常需要在我的 C# 应用程序中包含少量本机代码,我倾向于通过 C++/CLI 来完成。通常我只需要使用一个 C++ 库,它没有 .NET 的好替代品;但有时性能也是一个因素。

这是有问题的;这样做意味着添加对特定 x86 或 x64 库的引用。大多数库都支持 64 位和 32 位编译,或者只需要稍作修改即可在 64 位下工作。但是,我只能引用来自特定 C# 项目构建目标的版本之一。这意味着我需要为解决方案中的每个项目手动添加几个构建目标。

VS.NET 在这种情况下非常无用:如果将 C++ 库和 C# 库添加到同一个解决方案中,并且 C# 和 C++ 库同时具有 32 位和 64 位目标,则您的解决方案将包含“Any CPU”目标,即“混合平台”目标、x64 目标、x86 目标(C# 称之为 32 位)、win32 目标(C++ 称之为 32 位),也许还有更多;至少有两个版本(发布和调试,除非您添加了更多版本)。

这很快就变得一团糟,而且没有充分的理由。显而易见的行为不应该那么棘手:如果我有一个 C# 项目引用了一个 C++ 项目,那么 64 位版本应该引用 64 位版本应该有点明显,32 位版本也是如此。

最糟糕的是,所有这一切都导致了两个独立但相同的可执行文件:任何 CPU .NET 项目都可以在 32 位和 64 位模式下不加修改地工作,但我还没有找到加载适当平台特定支持的方法库取决于应用程序的启动模式。

总结这次漫长的漫谈:

  • 是否可以让在跨平台应用程序上使用 VS 变得不那么痛苦 - 让它在不手持的情况下将适当的引用添加到适当的构建目标?
  • 是否有一种简单的方法可以使用特定于平台的引用制作 .NET 可执行文件,该引用可以在 32 位和 64 位模式下运行,并根据需要加载适当的程序集?
4

2 回答 2

0

我的回答是肯定的。一种可能的方法是使用插件架构,所以它的工作原理是这样的,

  1. 当您的 C# 应用程序在 x86 上运行时,它会加载 x86 版本的插件。
  2. 当它在 x64 上运行时,它会加载 x64 版本。

然后为插件版本准备两个项目。一个配置为针对 x86 进行编译,而另一个配置为针对 x64 进行编译。反过来,x86 插件封装了 C++ 库的 x86 版本,以及 C++ 库的 x64 之上的 x64 版本。

这有点复杂,因为您必须维护两个插件项目文件,而源文件可以共享。

使用插件架构,插件库在运行时加载,因此您有足够的时间来检测现在是在 x86 还是 x64 上,然后决定加载哪个插件。

希望这有帮助。

于 2009-02-28T05:52:19.677 回答
0

您应该问自己的主要问题是,您是否需要 64 位版本。有关详细信息,请参阅Scott Hanselman我自己的博客文章。

如果你真的需要这两个版本,你也可以将 32 位和 64 位库都加载到 GAC 中,这样运行时就可以自动选择正确的一个。

如果您不想 GAC 您的库,您还可以查看此 StackOverflow 帖子,其中描述了加载正确程序集的方法。不过我不太喜欢这个解决方案,因为它确实需要一个插件模型

于 2009-03-01T15:16:31.400 回答