c# - C++/C# 解决方案中不可用的任何 CPU

标签 c# c++ managed anycpu

我有一个包含 C# 和托管 C++ 项目的解决方案。 它在解决方案平台 x64 和 x86 中编译。由于它是托管 C++,我想创建一个“任何 CPU”解决方案并摆脱旧的解决方案。

我将 C++ 项目链接器设置更改为 Force Safe IL Image for both x64 和 x86。

接下来,我使用配置管理器创建了一个名为“Any CPU”的新解决方案平台。接下来,我添加了一个项目平台,也称为“Any CPU”。

我继续将所有 C# 项目设置为“任何 CPU”,但对于 C++,我不能这样做。项目平台“Any CPU”不在下拉列表中,也没有“New...”选项。

VS 对它很满意,所以我保持原样并开始构建。令我惊讶的是,结果 DLL(来自 C++ 项目)是 MSIL,即使 C++ 的平台是 x64。编译 x32 时也会发生同样的情况,生成的 DLL 在 MSIL 中。

什么给了? 为什么我不能将 C++ 项目设置为“任何 CPU”?

最佳答案

据我所知,您不能在 Visual Studio 中为 C++/CLI 项目创建“AnyCPU”项目类型。但是,您可以配置您的 C++/CLI 项目(在“Win32”项目类型下),使其编译为纯粹、安全的 MSIL,无需目标平台。这样做将允许您的 C++/CLI DLL 程序集与“AnyCPU”C# 项目一起使用。 IE。它实际上是“AnyCPU”,尽管这不是它在配置管理器中的实际名称。

在“C/C++”项目设置中:

  • 公共(public)语言运行时支持:安全 MSIL 公共(public)语言运行时支持 (/clr:safe)

在“链接器”项目设置中:

  • CLR 图像类型:只要确保没有明确设置为 IJWPURE

注意事项:

  • 通过使用“安全”项目类型,一些似乎会影响平台类型的编译器和链接器选项将被忽略。 IE。您不必经历并将 everything 设置为非特定平台类型。就如上。但是,如果它让您感觉更好,您可以将其他选项设置为适当的值。 :)
  • “安全”将阻止指针的使用。如果这是一个重要的问题,显然可以通过更复杂的过程来完成。见 Creating a pure MSIL assembly from a C++/CLI project?了解详情。
  • 不要忘记,默认情况下,Visual Studio 将创建 C# 项目,即使它们是“AnyCPU”并且即使它们在 64 位操作系统上执行,也会作为 32 位进程启动。如果依赖项是 x86 而不是预期的纯/安全 MSIL,这可以隐藏平台不匹配问题。请注意(您可以通过取消选中 C# 项目的“构建”项目属性页面中的“首选 32 位”选项来控制这一点)。

关于c# - C++/C# 解决方案中不可用的任何 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280101/

相关文章:

c# - .Distinct() 调用不过滤

c++ - 不明确的模板类构造函数

c++ - 为什么模板化友元函数在类中定义时似乎没有公开?

c++ - 关于如何将 F# 代码与 native C++ 集成的任何想法?

c++ - 抛出异常时不执行析构函数(不展开堆栈)

c# - Visual Studios 使用 ASP 项目启动错误的 URL?

c# - 加载同一程序集的多个版本

c# - MonoGame 3.5 模板不会与 Visual Studio 一起安装

c++ - 无法用常量变量初始化数组...为什么?

c# - 在 C# 中屏幕抓取大型机屏幕*无需*第 3 方实用程序