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

C#与其他语言之间的互操作,c#,interop,C#,Interop,我有一个用C#编写的系统,它被设计成一个dll,其中包含一个实现特定接口的类,然后实例化该类,调用特定接口方法并使用响应 其背景是建立一个人工智能竞赛,人们将其人工智能作为C#DLL提交。这一切都很完美。耶 现在我想用同样的方法开始支持其他语言 基本上,用户应该上传一个文件(以及关于文件类型的元数据),然后我相应地调用该文件的内容 对于C#,这就是“上载dll”和“使用C#System.Reflection实例化它以获得实现接口的C#对象,然后只需调用相关方法” 我想知道我还可以支持哪些其他语

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

其背景是建立一个人工智能竞赛,人们将其人工智能作为C#DLL提交。这一切都很完美。耶


现在我想用同样的方法开始支持其他语言

基本上,用户应该上传一个文件(以及关于文件类型的元数据),然后我相应地调用该文件的内容

对于C#,这就是“上载dll”和“使用C#
System.Reflection
实例化它以获得实现接口的C#对象,然后只需调用相关方法”

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

但是,对于更直接地类似于实例化一个对象并直接与该对象交互的事物,有哪些选项呢

  • 看来
  • 如果我有一个包含JS代码的文本文件或zip文件,那么我可以在C#环境中以某种方式调用它吗?(请注意,这是在服务器上运行的-它不是网页,所以我不能简单地将JS注入网页)
  • 斯卡拉?(请注意,我对Scala一无所知,只知道它是一种函数式语言)
  • NodeJS?(同样,我只知道节点是服务器端JavaScript)
  • 其他人

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

找到在CLR中运行的语言肯定是最好的方法吗?它们与C#的接口方式没有太多的一致性,您需要做额外的工作来支持每种语言


另一种方法是生成一个单独的沙盒进程,并通过一些定义良好的接口进行交互(例如,一些使用标准I/O流的协议,或特定端口上的TCP或其他协议)。IIRC这就是谷歌人工智能挑战在过去的运作方式。这样,您就不必具体实现需要支持的每种语言。人们只需要提供一个符合您的界面的可执行文件。当然,在安全地对其进行沙箱处理时会遇到不同的问题,但这仍然是一个一般性的问题,而不是必须在每种语言的基础上解决的问题。

找到将在CLR中运行的语言肯定是最好的方法吗?它们与C#的接口方式没有太多的一致性,您需要做额外的工作来支持每种语言


另一种方法是生成一个单独的沙盒进程,并通过一些定义良好的接口进行交互(例如,一些使用标准I/O流的协议,或特定端口上的TCP或其他协议)。IIRC这就是谷歌人工智能挑战在过去的运作方式。这样,您就不必具体实现需要支持的每种语言。人们只需要提供一个符合您的界面的可执行文件。当然,在安全地对其进行沙箱处理时会遇到不同的问题,但这仍然是一个一般性问题,而不是必须在每种语言的基础上解决的问题。

Python?您可能应该检查这个链接:如果您设法将所有受支持的脚本语言(javascript、python等)编译为dll(最有可能是c/c++),那么您可以使用pinkvoke和封送处理从c#(如果这是最终目标)与它们交互。另一种选择是COM标准(我认为从长远来看,COM标准更具可操作性),其方式与IKVM相同。只要它是用与.NET兼容的语言编写的,并带有生成程序集的编译器,那么您就可以从C#自由使用它。实际上,所有语言都有一个.NET编译器,尽管这样的编译器并不总是程序员最先想到的.FYI-.Python?您可能应该检查这个链接:如果您设法将所有受支持的脚本语言(javascript、python等)编译为dll(最有可能是c/c++),那么您可以使用pinkvoke和封送处理从c#(如果这是最终目标)与它们交互。另一种选择是COM标准(我认为从长远来看,COM标准更具可操作性),其方式与IKVM相同。只要它是用与.NET兼容的语言编写的,并带有生成程序集的编译器,那么您就可以从C#自由使用它。几乎所有语言都有.NET编译器,尽管程序员可能并不总是第一个想到这样的编译器。