将Objective-C支持添加到.NET公共语言运行库需要什么?

时间:2008-10-29 03:38:56

标签: .net objective-c clr

.NET CLR是否可以支持Objective-C?是否有任何理由(从法律或实施的角度来看)为什么这是不可能的?

本着跨平台应用程序开发的精神,能够在Windows机器上编写和运行Objective-c应用程序会很不错。至少我认为会这样。

7 个答案:

答案 0 :(得分:6)

Objective-C是C的严格超集。因此,它有很多功能,比如指针很难转化为.NET。当然,可能是 - 在实践中 - 大多数Objective-C程序都是以这样的方式编写的,即它们也会针对更严格定义的语言规范版本进行编译,该版本更具限制性,但可以转换为安全的代码。

假设是这种情况,Objective-C的方法调度部分自然适合DLR的动态能力。我实际上考虑过创建这样一个端口。

答案 1 :(得分:4)

在CLR上托管Objective C应该没有问题。您可以实现DLR的运行时ontop,或者在最坏的情况下实现您自己的运行时。这仍然与编译CLR的任何实质性目标C代码库有很大不同,因为您可能感兴趣的绝大多数Objective C代码取决于Apple的框架。

最后,您需要重新实现它们,或者将Objective C桥接到.NET框架,这将允许您编写Objective C代码,但它不会使用与任何现有Objective C代码兼容的框架。您可能需要查看Cocotron这是一个交叉编译环境,允许Mac开发人员将一些Objective C应用程序移动到Windows。这应该为Windows的Objective C运行时提供一个相当好的示例,并且可能提供一些框架,以便在启动可以以.NET为目标的编译器时使合理数量的Objective C代码可用

答案 2 :(得分:3)

如果您的意思是能够使用Objective-C语法编写.NET应用程序并且能够使用Foundation框架中的数据结构(例如NSArray),那么这很简单(虽然很长)。这与添加对任何语言的支持没有什么不同。

然而,什么使得Mac上的Objective-C开发很棒不是语法,它是Apple提供的其他API:

除了这些难以实现的API之外,还需要考虑Bindings支持和Key Value Observing之类的内容,这些内容在CLR中实现起来要困难得多。

答案 3 :(得分:1)

不,确实没有。 .NET编译为IL(或CIL或MSIL),它基本上是虚拟机的机器代码。您可以在IL中编程,就像在汇编中一样(不是我见过有人这样做)。如果您有经验,知识和经验,那么将Objective-C写入IL编译器就没有问题。地狱,甚至有functional programming languages (F#)的.NET。除了消息传递功能和库之外,它与C#,VB.NET等没有什么不同。

多么棒的主意! Objective-C#或其他一些。

您可以在这里开始:Wikiepedia on Microsoft's IL.

答案 4 :(得分:1)

正如其他人所说,是的,这是可能的。这是一个好主意(尤其是“跨平台开发精神”)是另一回事。 同样,正如已经指出的那样,没有图书馆的语言并不多。由于目标C现在几乎只在Mac / iPhone环境中使用,因此能够在Windows上编写代码并不会给你带来太大的好处,如果它们是你的目标。

此外,您可以在Windows上编写Objective C - 我相信通常与XCode一起使用的gcc也会在Windows上编译Obj C,以及GnuStep。

只是留下了在.Net上运行Objective C是否有优势? Objective C的一些很好的功能,这些功能在典型的.Net语言中找不到。我个人非常喜欢参数的方法名称标签。 但是我认为让它值得一试是不够的。 Objective C擅长的大多数事情,C#都有自己的解决方案。现在,如果他们只是拒绝实施命名参数......

答案 5 :(得分:1)

使用NObjective桥,您可以使用C#中的现有Objective-C类或创建新类。在最终发布'Visual Studio 2010'和'.NET 4'后,我将为NObjective添加DLR支持。

答案 6 :(得分:0)

.Net的Objective-J和Cappuccino怎么样,而不是Objective-C和Cocoa? Objective-J和ObjC一样吸引人,但ObjJ比ObjC更接近C#(没有指针,gc等)

我最近在Cappuccino开发者论坛上询问了这个问题,他们向我指出了Jurassic(.Net的Javascript编译器)。他们还说卡布奇诺在IronJS上运作良好。所以,看起来组件就在那里(ObjJ - > Javascript - > .Net),但必须建立将它们连接在一起的桥梁。

有没有其他人在这看到任何价值?