我经常需要在我的 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 位模式下运行,并根据需要加载适当的程序集?