问题标签 [mono-embedding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
6037 浏览

c++ - 嵌入:mono vs lua

我有兴趣了解人们在 C/C++ 应用程序中嵌入单声道(.NET 的开源实现)的经验。如何分发这样的应用程序以及依赖项是什么?我已经在 OS X 上进行了测试,mono 是一个巨大的框架(数百 MB)。我的应用程序的用户是否都需要这个大框架,或者可以将其剥离或将所有内容编译到主可执行文件中。

我以前有在 C++ 应用程序中嵌入 Lua 的经验,而且效果非常好,因为我可以将整个 lua 解释器与我的主要可执行文件静态链接。所以我没有外部依赖。可以用单声道做类似的事情吗?

这里有任何 Lua 人可以评论他们如何发现 Mono 与 Lua 相比吗?

PS:通过嵌入,我的意思是一个 C++ 应用程序,它初始化一个单声道环境并加载一个 .NET 程序集并执行它,然后允许在程序集中的 C# 代码和主可执行文件中的 C++ 方法之间进行通信。

0 投票
2 回答
4519 浏览

debugging - 调试嵌入式单声道运行时启动的 C# 程序集?

我说的是使用 C# 进行游戏编程的小型游戏引擎。所以,我有一个嵌入单声道运行时的 C++ 应用程序(我称之为“启动器”)。我有一个用 C# 编写的程序集,这是我的游戏引擎类库。启动器按照Embedding Mono中的建议启动程序集。

现在是有趣的部分!启动器在 C++ 中实现了作为我的游戏引擎类的内部方法公开给单声道运行时的杂项函数。这就是为什么如果没有使用 C++ 实现大部分引擎的启动器,我的游戏引擎组件就什么都不是。

问题:我应该如何调试我的 C# 程序集?更重要的是,我应该如何调试我要用 C# 编写的游戏???

如您所知,我无法使用 MonoDevelop Debugger 调试程序集,因为它不会接收其某些方法的内部 C++ 实现。

我需要的是运行启动器。然后,启动器将使用嵌入式单声道运行时启动 C# 程序集。然后我需要一些东西来连接到已启动的程序集以允许其调试。

或者任何其他方式。谢谢!

0 投票
1 回答
1145 浏览

c# - 嵌入式 Mono:在 C++ 中创建/编组 C# 结构

我正在开发一个嵌入 Mono 的应用程序,并且我有一个简单的 C# 结构,它是我的一个函数的参数之一。

如何创建该结构并将其从 C++ 传递到 C#?

如果我有这样的 C# 结构:

我可以创建一个严格的 C++ 版本并将其传递给 mono 吗?

0 投票
1 回答
4067 浏览

c# - 嵌入式 Mono:如何在不同线程上使用“mono_runtime_invoke”

嗨,我正在使用带有 NaCl 的 Embedded Mono。到目前为止一切正常,但不知道如何从 c 调用 .NET 方法,这与执行 .NET exe 不在同一个线程上。

这是我尝试使用的方法:

0 投票
1 回答
526 浏览

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

我正在尝试使用 libmono 在 C 应用程序中嵌入 C# 类,但文档有点缺乏。

我正在尝试使用原型调用方法void MessageToSend(out MessageObject message);

我如何表示“输出参数”?它是指向 MonoObject 的指针吗?谢谢。

PS。就 libmono 而言,'out' 和 'ref' 参数是否相同?

0 投票
1 回答
948 浏览

c# - 嵌入单声道时如何从对象中获取数组字段

我将单声道嵌入到我正在编写的应用程序中。我创建的对象之一如下所示:

如果我使用mono_field_get_value_object我可以获得MonoObject *代表消息数组的 a,但是我怎样才能像数组一样访问它?是否有一些明确的演员表MonoArray *

谢谢。

0 投票
1 回答
377 浏览

macos - 嵌入式单声道:调用 mono_jit_cleanup() 时的 EXC_BAD_ACCESS (SIGSEGV)

我将 Mono 运行时嵌入到现有的 Cocoa 应用程序中。我已经从 GitHub(主分支)构建了最新的运行时,并且在运行一些托管代码后退出应用程序在 mono_jit_cleanup() 期间给了我这个:

https://dl.dropbox.com/u/108566029/BAD_ACCESS.png

仅当我尝试通过 HttpWebRequest 发送 HTTP 请求时才会复制它。特别是如果我调用 GetRequestStream()。代码工作正常,所有托管对象都正确处理。mono_jit_cleanup() 只被调用一次。该问题仅在关闭运行时发生。

这也在最新的 Mono 2.10.x 分支上重现。但是我得到了 SIGSEGV。

这可能发生在不同的地方,所以它似乎是一个线程问题。

那么,我应该如何正确关闭运行时。mono_jit_cleanup() 调用是否足以正确处理运行时?我可以在不处理运行时(没有 mono_jit_cleanup() 调用)的情况下退出应用程序吗?



PS
我在 OSX 10.8.3 上使用 32 位版本的 Mono v2.0(实际上是 3.5)运行时。我链接到 libmono-2.0.1.dylib,所以它应该是 Boehm GC。SGen GC 也重现了同样的问题。

PPS
这里出现另一个错误https://dl.dropbox.com/u/108566029/SIGABRT.png

0 投票
1 回答
951 浏览

mono - 将 mono 与嵌入它的 c++ 应用程序捆绑在一起

我创建了一个示例 c++ 应用程序,它使用动态链接来嵌入单声道(如此处所述http://www.mono-project.com/Embedding_Mono)并使用 C# 编写脚本。只要将 mono 安装在全局程序集缓存 (GAC) 中,它就可以正常工作。

有没有办法将 mono 与我的 c++ 可执行文件捆绑在一起,以便我可以将它与我的 c++ 可执行文件一起安装?

我一直在看 mkbundle,但它看起来像是将 mono 与 c# 应用程序打包在一起。

编辑:重新格式化下面的答案

编辑:更正:我只需要在可执行文件的文件夹中复制/粘贴 mono-2.0.dll 并用于 mono_set_dirs("C:\\cygwin\\usr\\local\\lib","C:\\cygwin\\usr\\local\\etc");强制使用特定框架

0 投票
1 回答
2765 浏览

mono - 使用 Mono Embedded 获取泛型类型

如何使用单声道嵌入式调用创建通用 List<String> 对象?我可以得到 List 的 MonoClass:

我在文档中看到有

但我不知道在哪里以及如何获得 MonoGenericParam。或者也许我需要为 mono_class_from_name 构建一个有效的名称?我认为这可能会慢一些,但我现在会接受。我试过了

但没有运气。

更新:

好的,我找到了一种方法。我仍然想看看是否有官方的做事方式,因为这个黑客对我来说看起来太脏了。

基本上我搜索了通用方法的单声道源并找到了 mono_class_bind_generic_parameters (参见https://raw.github.com/mono/mono/master/mono/metadata/reflection.c)。除了 .so 之外,我还必须链接到 libmono-2.0.a 才能使用它。但它奏效了:

我想我可以获取这些方法的来源(更新:几乎没有)并重新实现它们(它们解析元数据等)——如果我不想链接到 .a——但我想知道是否有更简单的方法。Mono 文档不像他们过去那样回答任何问题。

更新:找到这个线程: http: //mono.1490590.n4.nabble.com/Embedded-API-Method-signature-not-found-with-generic-parameter-td4660157.html这似乎说不存在嵌入式API对于我想要的(即他们不费心公开mono_class_bind_generic_parameters)。有人可以证明它是正确的吗?顺便说一句,使用这种方法,我得到 MonoReflectionType* 并且无法从中取回 MonoType* - 虽然从结构中获取 ->type 一样容易 - 这是内部的,通过函数访问它是内部的。Mono Embedded 应改为“Mono Internal”。

更新:另一种方法是使用内部结构的副本破解 mono_class_inflate_generic_type:

这不需要到 .a 的静态链接,但更糟糕的是 hack。并且 mono_class_inflate_generic_type 被标记为已弃用-因此,如果已弃用,那么哪个是现代的?

0 投票
1 回答
1545 浏览

c# - 单声道嵌入,在不知道命名空间的情况下获取 MonoClass*

鉴于下面的 C# 示例代码,从 C 调用静态方法非常容易Bar.Work。只需获取 a MonoClass*,然后MonoMethod*从类中获取 a 并调用它。

问题是,为了获得MonoClass*我需要提供 Bar 的命名空间,在这种情况下'sampleApp',它作为参数提供给函数。

MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");

MonoClass*问题是如果我不知道Bar的类命名空间,如何获得in C 。有没有办法从 C 中获取程序集中的类型列表?我在单声道的嵌入样本中找不到任何示例。

C# 示例

Bar.Work从 C调用