Mono .NET 是不是支持和编译 C++/CLI?

Posted

技术标签:

【中文标题】Mono .NET 是不是支持和编译 C++/CLI?【英文标题】:Does Mono .NET support and compile C++ / CLI?Mono .NET 是否支持和编译 C++/CLI? 【发布时间】:2008-10-08 15:26:37 【问题描述】:

Mono .NET 是否支持和编译 C++/CLI?

如果没有,你知道他们是否有支持它的计划吗?

【问题讨论】:

【参考方案1】:

我们没有用于 C++/CLI 的编译器,对于非常小的用户群来说,这将是一项非常大的工作。还要考虑到 C++/CLI 规范本身就有缺陷且不可移植,因此在一般情况下能够编译它并没有多大帮助。

您可以使用 MS .NET 编译器进行编译并在具有以下限制的情况下以单声道运行:

    如果 C++/CLI 应用程序是纯托管的,则可以在任何系统上使用 mono 运行(但是,为什么要使用如此丑陋的语言而不是 C#?)

    在其他情况下在 windows 上使用 mono 运行(C++/CLI 应用程序通常是不可移植的并且包含本机代码,因此它们只能在 windows 上运行并且对于 mono 的主要目标是无趣的在 Linux 上运行托管程序)

请注意,MS 本身最终会放弃 C++/CLI,因此不要在其上投入过多并切换到 C#。

【讨论】:

"MS 本身最终会放弃 C++/CLI" 你能解释一下你为什么这么认为吗?在我看来这不太可能。 托管 C++ 已经不受支持和停产,他们很快就做到了。现在去统计过去一两年中与 C++/CLI 相关的新闻,博客文章,公告。连接点。 托管 C++ 因严重的可用性问题而被删除。 C++/CLI 作为一种互操作语言不会消失,但它已经是 GUI 的二等公民 - WPF 不支持,也永远不会支持。 很有趣的是,C++ 已经死了,直到 2011 年末,Cmets 仍在继续。C++ 在 Microsoft (WinRT) 中表现得非常好,以至于现在有些人担心是 C# 出了问题。我不认为。无论如何,您现在可以使用 XAML 开发 C++ 应用程序,所以上面的一些评论者一定会感到惊讶。 我认为这里真正未说出口的问题是 Mono 必须用什么来弥补这一差距:如何将我的绑定写入 C++ 库以供 C# 项目使用?只说“C++/CLI 很烂,所以我们不会这样做”是一回事,而不考虑还有什么可以使用的问题。【参考方案2】:

Mono 最近在 CXXI 中的 C++ 互操作性方面取得了相当大的进步。

From this posting,简而言之,新的 CXXI 技术允许 C#/.NET 开发人员:

轻松使用来自 C# 或任何其他 .NET 的现有 C++ 类 语言 从 C# 实例化 C++ 对象 从 C# 代码调用 C++ 类中的 C++ 方法 从 C# 代码调用 C++ 内联方法(前提是您的库是使用 -fkeep-inline-functions 编译的,或者您提供了代理项) 图书馆) 从 C# 继承 C++ 类 用 C# 方法覆盖 C++ 方法 向 C# 代码和 C++ 公开 C++ 类或混合 C++/C# 类的实例,就像它们是本机代码一样。

CXXI 是 Google 代码之夏为改进 Mono 与 C++ 语言的互操作性而开展的两个暑期工作的成果。

【讨论】:

这个项目的现状如何?是否处于可用状态?大约一年内回购中没有任何活动,讨论组非常空旷。 如果将来有任何支持此功能的计划会很有趣。 它好像死了。【参考方案3】:

Mono 能够运行由 C++/CLI 生成的“纯”程序集,即。不包含任何本机代码的代码。 C++ 编译器支持的各种 /clr 选项记录在 MSDN 上。

目前不支持编译 C++/CLI。已经有一些关于修改 GCC 以发出 IL 的工作,但它并不完整(并且看起来不活跃)。看到这个article。

我不相信 Microsoft 记录了在程序集中包含本机代码的格式,因此很难支持。

【讨论】:

【参考方案4】:

这是一个非常古老的问题,几年后得到了非常有趣的答案。 截至目前,tritao/CppSharp 是 mono/cxxi 最积极开发的分支,它于 2013 年移回 mono 存储库,此后一直在积极开发,当前的树可以在 mono/CppSharp 找到

他们的自述文件是here,“生成器”的功能是:

多个后端:C++/CLI 和 C# P/Invoke 多个 ABI:Itanium、MS、ARM、ios 和 iOS64 多平台:Windows、OS X 和 Linux 虚拟表覆盖支持 多重继承支持 通过用户通道轻松扩展语义 对 STL 的工作中支持(仅限 C++/CLI) 强类型自定义 API 和类型映射

它还带有很多很酷的 AST 东西和一个解析器。

【讨论】:

【参考方案5】:

不,C++/CLI 在 Mono 下是 not supported,可能永远不会,尽管使用 MS 编译器生成纯 IL 将允许完全托管的代码在 Mono 下运行。

作为一种互操作语言,C++/CLI 的存在使调用非托管代码成为可能。另一种选择是使用 P/Invoke,它是 well-documented,尽管有问题。

【讨论】:

你在想什么样的问题?【参考方案6】:

在 Mono 2.4 上,您可以运行在例如下面编译的 C++/CLI 应用程序。带有 /clr:safe 开关的 Visual Studio 2008。

【讨论】:

【参考方案7】:

转到here 并查看“缺少的语言”。但不能编译不代表不能运行。您可以使用框架 sdk 编译您​​的 C++ 代码并尝试使用单声道运行它。无论如何都值得一试。

【讨论】:

以上是关于Mono .NET 是不是支持和编译 C++/CLI?的主要内容,如果未能解决你的问题,请参考以下文章

从Unity3D编译器升级聊起Mono

windows下如何用mono运行.net程序

HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?

windows下如何用mono运行.net程序

我是否需要特殊许可才能分发使用mkbundle编译的Mono可执行文件?

使用Mono将C#编译运行至WebAssembly平台