2009-08-01 75 views
6

继Jeff和Joel关于插件体系结构的讨论之后。.Net和插件体系结构

C++中的插件(使用运行时加载的dll)总是有点痛苦。你必须做很多基础工作才能启用它们,然后插件也必须用C++编写,通常甚至使用相同的编译器。 COM对象和ActiveX解决了一些这些问题,但引入了一些自己的问题。
然后向C++应用程序添加一个python接口是一项大量的工作。

我正确地认为用一种.Net语言编写的所有库(或程序集或任何你称之为它们)总是可以从另一个.Net语言调用吗?数据类型是否可以自动在它们之间传输?

大概因为所有.Net语言也使用WinForms(或WPF)作为gui,所以给予主应用程序gui的插件访问也相对简单。

对不起,如果这是一个相当明显的一点,我只是一个老式的C++程序员。但通过C++/CLI重用现有C++库的容易性使我相信C#/ .Net可能值得更多的调查。

编辑 - 谢谢,我期待讨论插件是否是去.Net的原因。能够编写ironpython,同时让我的商业用户能够在VB中编写一个简单的插件,并且技术用户能够在F#中巧妙地编写一些东西,而不需要我做更多的工作似乎是从C++切换的一个很好的理由

+0

感谢这是一个关于插件是否是.IL – 2009-08-02 00:10:38

回答

3

我是在想纠正所有库(或组件或任何你打电话给他们)用.Net语言编写的文档总是可以从另一个.Net语言中调用?数据类型是否可以自动在它们之间传输?

是的。在.NET中,跨语言兼容性是可能的,因为CTS(为所有.NET兼容语言提供一组通用数据类型,并确保类型兼容性)和CLS(定义了一组最低标准,所有.NET语言编译器必须符合,从而确保语言的互操作性)。在编译过程中,任何.NET兼容语言的源代码都会被相应的语言编译器转换为中间语言代码。由于所有.NET程序集(EXE或DLL)都作为中间语言存在,因此它们可以在它们之间进行互操作。所有.NET兼容语言都使用相同的数据类型,仅表示为.NET类型。因此,无论您是在C#中使用int还是在Visual Basic .NET中使用Integer,都在IL中表示为System.Int32。 [Source]

+0

+1关于IL工作的重要优点的讨论。我没有真正想过最终用户使用C#之外的其他软件编写插件。 – IAbstract 2010-01-26 04:38:14

0

主要问题在.Net下插件不能从插件的dll中调用代码(并与它互操作),但安全问题。这些也可以解决,你可以看看这里(链接那里的样本也应该提供一个非常简单的主机+插件)How to create a Plugin Model in .NET with Sandbox?

而对于.Net语言之间的互操作性 - 这是没有问题的。
共享gui - 我已经使用Winforms完成了这个任务,虽然我不知道在WPF下它是否也很容易,但我从来没有尝试过。

1

如果您正在寻找插件库,NET,有一对夫妇的选择我所知道的:

两者都是开源的,所以你可以看到他们如何创建插件环境。

+0

感谢单声道提示! – IAbstract 2010-01-26 04:38:45