从非特定的.NET应用程序引用特定于平台的库

时间:2009-02-27 23:57:39

标签: .net c++ visual-studio cross-platform platform-specific

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

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

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

这快得搞乱了,并没有充分的理由。显而易见的行为应该不是那么棘手:如果我有一个引用C ++项目的C#项目,那么64位版本应该引用64位版本并且类似于32位应该是显而易见的。

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

总结这漫长的漫步:

  • 是否有可能在跨平台应用程序上使用VS减少痛苦 - 让它在没有手持的情况下添加适当的构建目标的适当引用?
  • 是否有一种简单的方法可以使用特定于平台的引用来生成.NET可执行文件,这些引用可以在32位和64位模式下运行,并根据需要加载适当的程序集?

2 个答案:

答案 0 :(得分:0)

我的回答是肯定的。一种可能的方法是使用addin架构,因此它的工作原理如下,

  1. 当您的C#应用​​程序在x86上运行时,它会加载x86版本的插件。
  2. 当它在x64上运行时,它会加载x64版本。
  3. 然后为addin版本准备两个项目。一个配置为x86编译,另一个配置为x64。反过来,x86 addin包含了C ++库的x86版本,以及x64 over C64库的x64版本。

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

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

    希望得到这个帮助。

答案 1 :(得分:0)

您应该问自己的主要问题是,您需要64位版本吗?有关详细信息,请参阅Scott Hanselmanmyself的博客帖子。

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

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