C#和其他语言之间的互操作

时间:2018-02-21 11:27:30

标签: c# interop

我有一个用C#编写的系统,它被设计为一个包含实现某个接口的类的dll,然后实例化该类并调用某些接口方法并使用响应。

背景是建立人工智能竞赛,人们将他们的AI提交为C#dll。这一切都很完美。耶!

现在我想通过相同的方法开始支持其他语言。

从根本上说,用户应该上传一个文件(以及有关哪种文件的元数据),然后我会相应地调用该文件的内容。

对于C#,那就是"上传一个dll"和#34;使用C#System.Reflection实例化它以获得实现接口的C#对象,然后只需调用相关方法"。

我有兴趣知道我可以支持哪些其他语言? 我可以与任何可以编译成.exe并通过命令行进行交互的东西进行交互,或者我可以设置基于Web API的交互。

但是对于那些更直接类似于实例化对象并直接与该对象交互的东西有什么选择呢?

  • 似乎Java can do this via IKVM
  • 如果我有一个包含JS代码的文本文件或文件zip,那么我可以在C#环境中以某种方式调用它吗? (请注意,这是在服务器上运行 - 它不是一个网页,因此我无法将该JS注入网页)
  • Scala呢? (请注意,我对Scala一无所知,除了它是一种功能语言)
  • 的NodeJS? (同样,我所知道的是Node是服务器端的JavaScript)
  • 其他?

我非常高兴能找到解决这个特定语言问题的其他SO问题的链接的答案 - 尽管我希望您确保它在我的特定上下文,用户上传文件(可能是zip?),我直接在服务器端C#环境中调用它。

1 个答案:

答案 0 :(得分:2)

发现在CLR中运行的语言绝对是最好的方法吗?它们与C#的接口方式并不是很一致,而且您正在做额外的工作来支持每种语言。

另一种方法是生成一个单独的沙盒进程,并通过一些定义明确的接口进行交互(例如,某些商定的协议使用标准I / O流,或TCP在特定端口或某些东西上)。 IIRC这就是Google AI挑战过去的工作方式。这样,您就不必专门实现您需要支持的每种语言。人们只需要提供符合您界面的可执行文件。当然,你有不同的安全沙箱问题,但这仍然是一个普遍的问题,而不是一个必须在每种语言基础上解决的问题。