如何使用嵌入在 C++ 中的单声道编译 C# 代码?

Posted

技术标签:

【中文标题】如何使用嵌入在 C++ 中的单声道编译 C# 代码?【英文标题】:How do you compile C# code using mono embedded in C++? 【发布时间】:2020-08-23 00:17:12 【问题描述】:

如何使用 C++ 编译 .cs 文件

我已经搜索了 Mono 的所有文档,但找不到仅从 C++ 中的嵌入式 Mono 运行时编译 C# 代码的方法。我知道如何使用 C++ 中的嵌入式单声道函数打开 C# .exe 汇编文件,但我似乎无法找到一种方法来将 .cs 文件从 C++ 编译为 .exe

我还设法通过从 Windows 提供的 CreateProcessA() 函数调用 mcs.bat 文件来编译 .cs 文件,但是这并没有给我一种记录错误甚至检查它是否成功编译的方法等等(感觉也像 hack 而不是官方解决方案)。我需要这样做的主要原因是,我可以通过检测源代码何时更改以及另一个条件子集来动态重新编译 C# 脚本。

有人知道使用嵌入式 Mono 运行时正确编译 C# 文件的方法吗?在哪里可以找到这方面的文档?目前我一直在使用这里的文档:http://docs.go-mono.com/?link=xhtml%3adeploy%2fmono-api-assembly.html,它在大多数情况下提供了足够的信息。

在 DLL 中链接 Mono

另外,如果您熟悉嵌入单声道,您知道如何在 dll 中使用它吗?我已经成功地在控制台应用程序中链接和编译它,但是当我尝试将它编译为动态库的一部分时,我得到未解决的外部符号错误(特别是带有前缀 __imp* 的函数)。

最后,我使用 mono 来嵌入 C# 作为我的游戏引擎的脚本语言,但是我不知道是否有更好(更小)的解决方案可以使用。如果您知道任何更好的解决方案,请随时提出建议。

【问题讨论】:

我不太清楚你的意思。您想将 C# 交叉编译为 C++、使用 Mono 编译 C++(例如作为 DLL)还是完全其他的东西? .cs 文件是 C#,但你想用 C++ 编译它? 嘿@kettle3D 我正在尝试在 C++ 中编译 C# 文件。看起来使用单声道编译 C# 的唯一方法是使用 mcs.bat,但我想知道他们是否在嵌入式运行时中也提供了一个方法来做到这一点。对我来说,他们会让你能够使用他们的嵌入式 API 加载已编译的 C# 脚本,但没有提供编译它们的方法,这对我来说没有意义。那有意义吗?如果没有,我可以添加一些带有更多细节的代码 sn-ps。啊,我刚刚意识到我在问题的介绍中也有一个错字,这可能会导致一些混乱 运行时只是运行时。如果需要编译 C# 代码,则需要托管 Roslyn 等编译器。 @LexLi Roslyn 看起来很有前途,我想有一个单独的库用于运行时和编译是有意义的,但它似乎非常重量级。我知道 C# 无论如何都是重量级的脚本语言,但是这是使用单声道嵌入语言的典型方法吗?在嵌入脚本语言时,我找不到很多谈论最佳实践的资源,只是想确保我没有做任何愚蠢的事情。也感谢您的帮助! @LexLi 我想了一会儿。并且单声道确实带有编译器(mcs.exe)......我只是不明白为什么他们会公开他们的运行时API而不是编译器API,除非我在这里遗漏了一些东西 【参考方案1】:

单声道运行时是一个“运行时”,仅用于运行代码, 但如果你已经安装了csc 命令,那么你可以使用这个:

#include <cstdlib>
int main()
   system("csc yourfile.cs")
   return 0;

【讨论】:

The mono runtime is a Runtime, only for running the code 不正确,使用内部编译器可以轻松完成。

以上是关于如何使用嵌入在 C++ 中的单声道编译 C# 代码?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

通过单声道将数组从 C++ 传递给 C#

如何使用弹簧反应 webflux 中的单声道和助焊剂使用 DTO 制作新的单声道

使用 C#“输出参数”嵌入单声道

单声道嵌入,从 C 调用 C# 泛型方法

编译的单声道丢失默认.NET库 - 未定义或导入System.Object