我经常需要在我的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位模式下不加修改,但是我没有找到一种方法来加载相应的特定于平台的支持库,具体取决于应用程序的启动模式。
总结这漫长的漫步:
答案 0 :(得分:0)
我的回答是肯定的。一种可能的方法是使用addin架构,因此它的工作原理如下,
然后为addin版本准备两个项目。一个配置为x86编译,另一个配置为x64。反过来,x86 addin包含了C ++库的x86版本,以及x64 over C64库的x64版本。
这有点复杂,因为你必须维护两个addin项目文件,而源文件可以共享。
使用addin架构,addin库在运行时加载,因此您有足够的时间来检测x86或x64上是否存在,然后决定加载哪个插件。
希望得到这个帮助。
答案 1 :(得分:0)
您应该问自己的主要问题是,您需要64位版本吗?有关详细信息,请参阅Scott Hanselman和myself的博客帖子。
如果你真的需要两个版本,你也可以将32位和64位库加载到GAC中,这样运行时就可以自动选择正确的。
如果您不想GAC库,您还可以查看this StackOverflow post,其中描述了加载正确程序集的方法。我不喜欢这个解决方案,因为它确实需要一个插件模型