无法在IronRuby中将X :: Y :: Z转换为X :: Y :: Z.

时间:2013-09-12 21:34:31

标签: c# ironruby

我正在玩IronRuby。我制作了一个互动小说游戏的存根。在C#中,我有一个Command类,它代表一个命令(名称,要键入的文本和操作委托):

public delegate string CommandAction(string target,string instrument,string preposition);         私有CommandAction动作;

    public Command(string name, string[] verbs, CommandAction action)
    {
        this.Name = name;
        this.Verbs = verbs;
        this.action = action;
    }

我在C#中创建命令没有任何问题。这是最简单的:

this.knownCommands.Add(new Command("Quit", new string[] { "q", "quit" }, (t, i, p) =>
{
    isRunning = false;
    return "Bye!";
}));

(现在不要担心这三个参数,它们都是字符串。)

我想创建一个命令并将其添加到我的IEnumerable<Command>列表中。这是Ruby代码:

def to_clr_string_array(list)
    System::Array[System::String].new(list.map { |s| s.to_s.to_clr_string })
end

require 'Meltdown.Core.dll'
include Meltdown::Core

Command.new("Ruby Command", to_clr_string_array(['rb']), Proc.new { |target, preposition, instrument|
    puts "Command invoked with #{target}, #{instrument}, and #{preposition}"
})

to_clr_string_array是转换列表类型所必需的。)当我尝试实例化它时,我收到类型转换错误:Can't Convert Meltdown::Core::Command into Meltdown::Core::Command。我是这样做的:

var engine = Ruby.CreateEngine();
var scope = Engine.Runtime.CreateScope();
string contents = System.IO.File.ReadAllText(scriptPath);
var command = engine.Execute<Command>(contents, scope);

第三行失败。我尝试this answer to a similar problem,同时将我的数组更改为对象列表。当我执行命令时,我得到的错误是类型不同,而不是实例化失败。

在该详细错误中,它提到与我链接的答案中的问题完全相同的错误:类型仅在其上下文中有所不同(DefaultLoadNeither)。

不幸的是,这对我没有帮助,我仍然无法弄清楚如何做到这一点。我已经尝试将我的命令列表传递给Ruby,但是我收到一个错误,类型不匹配,它不能进入​​我的列表。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我将这个问题发布到了ironruby-core邮件列表中。 Brandon Doot回复并建议我补充说:

load_assembly 'SharedClasses'

这解决了这个问题。就.NET而言,类型现在是相同的。